如果你只有一小时,又想搞懂持续集成到底是怎么一回事,我建议你别去翻那本六百页的《Jenkins权威指南》,也别一上来就研究什么分布式构建、Pipeline语法进阶。这些年我帮团队搭过好几套自动化发布流程,也从零带过不少刚接触CI/CD的开发者。一个很深的体会是:Jenkins真正让人上手的门槛不在工具本身,而在于信息太碎。你搜一篇教程,它教你装好环境就结束了;再搜一篇,它又默认你懂Maven、懂Docker、懂Git分支策略。结果是,你花了一晚上装环境、配插件,最后连一个能跑的构建任务都没建出来。
这篇“一小时Jenkins教程”,就是把我平时带人入门的那套路线,原原本本搬到这里。它不追求让你一小时变成专家,而是让你在一小时内,用一条清晰的路径,把Jenkins从安装、配置到产出第一条可用的构建流水线全部跑通。你会看到每个步骤背后“为什么要这么做”,也会看到那些教程里不会写但在现场一定会踩的坑。这篇文章适合所有刚接触持续集成、想在公司或自己的模拟项目里快速落地一套自动构建流程的人,无论你用Linux、Windows还是macOS,核心思路都是一样的。
1. 整体设计:一小时的时间预算,应该花在哪里
一小时真的能学会Jenkins吗?我的回答是:能,前提是你得控制好“学习深度”和“操作范围”。很多新手学不会,不是笨,是把时间花错地方了。
1.1 你真正需要的Jenkins,是它最基础的那一面
我先说清楚这一小时你能拿到什么结果:一个安装好的Jenkins实例、一个能连接代码仓库的凭据配置、一条可以手动触发并完成“拉代码—执行构建—产出构建结果”的流水线任务。这个能力覆盖了日常工作中至少七八成的使用场景。
这意味着我们要砍掉什么?分布式构建、Kubernetes集成、Pipeline共享库、灰度发布、多分支流水线这些内容,一小时里一律不碰。不是我故弄玄虚,而是这些概念都需要建立在“基础流水线已经跑通”的前提下才有意义。就像学开车,你还没掌握油门刹车就研究漂移技巧,除了翻车没有第二种结局。
我把这一小时拆成了四段:15分钟用来搞定安装和初始化,10分钟做基础配置和凭据管理,20分钟写一条能跑通的Pipeline脚本,剩下15分钟用真实项目做一次完整的实战验证。这个时间分配我反复调整过,核心思路是“安装要快、配置要稳、脚本要小、实战要真”。
1.2 为什么不是GitHub Actions,非要学Jenkins
我知道现在托管CI服务很多,尤其是GitHub Actions,配置简单、免费额度也够个人项目用。那为什么还要学Jenkins?我遇到过太多次类似场景:公司内网的代码仓库不允许任何代码出网,或者构建环境需要访问内网专用的依赖库,又或者甲方要求所有构建产物必须留存在本地服务器上。在这些环境里,托管式CI根本进不来,Jenkins是少数能完全私有化部署的开源方案。
另外还有一点可能更实际:市面上大量存量项目的自动化脚本都是基于Jenkins写的。你入职一家公司,大概率第一周就要打开人家的Jenkins后台看构建任务。懂一些Jenkins的基本结构和排查思路,至少你不会对着一个红色的失败任务发呆。所以我不是让你二选一,而是建议你把Jenkins当作理解CI/CD原理的“解剖样本”:它把构建、测试、发布这些概念拆得明明白白,你搞懂它之后,再去用任何其他CI工具都会觉得似曾相识。
1.3 时间到之前,先给自己设定一个验收标准
为了避免一小时后你一脸茫然不知道自己学了啥,我用一句话来定义这次学习的验收标准:**你能否在不看教程的情况下,新建一个Pipeline任务,输入一段能完成拉取远程仓库代码并执行构建命令的脚本,成功跑通一次构建?**如果这个问题你在一小时后能回答“能”,那么这次学习就是有效的。
我见过太多人学Jenkins,学了一堆名词——“节点”“标签”“插件”“视图”,问他会不会建任务,他摇头。这就是典型的输入过剩、输出不足。所以这篇文章从头到尾都在为“建一条流水线”这一个目标服务。所有配置项,凡是跟这个目标无关的,我都不要求你记。等到你真的需要的时候,再回来查文档也不迟。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 开局准备:15分钟把Jenkins跑起来
安装这一步看起来最没技术含量,但恰恰是翻车率最高的地方。我总结了三个高频问题,你先有个心理准备:JDK版本对不上、安装源卡顿、初始化插件装到一半超时。下面我带你一步步绕过这些坑。
2.1 JDK版本别选错,这是我见过最常见的翻车点
很多新手在装Jenkins之前,根本没意识到它依赖Java。结果就是用Docker拉镜像、或用包管理器装完Jenkins,启动时报错或者页面打不开,一脸懵。
Jenkins 2.x版本要求JDK 8或JDK 11,而较新版本的Jenkins(从2.346开始)要求JDK 8或JDK 11,从2.357开始推荐Java 11,后续版本则开始要求Java 17。这里的关键点不是让你背版本号,而是让你记住:装之前先去Jenkins官网的“Requirements”页面确认一下你手上的JDK版本是否兼容。
检查JDK版本很简单,终端里执行:
bash复制java -version
如果显示的是OpenJDK 11或者OpenJDK 17,基本没问题。如果显示的是Java 8且Jenkins版本较新,我建议你优先装一个更合适的JDK版本,而不是强行去装老版本Jenkins。为什么?新版Jenkins持续修复安全漏洞,很多企业安全扫描都不允许使用停止维护的老版本。你没必要在第一次学习时就给自己埋一个安全隐患。
如果机器上还没有Java,我推荐直接装OpenJDK。以Ubuntu系统为例,一条命令就能装好:
bash复制sudo apt update
sudo apt install openjdk-11-jdk
装完再执行一次java -version确认成功。这一小步值得你花两分钟,它能避免后面绝大部分启动失败的问题。
2.2 安装方式怎么选
Jenkins官方提供了两种主流安装方式:原生包安装和Docker运行。我两个都用过,也都帮人排查过问题,下面说点实在的。
如果你只是本地学习,我推荐用Docker方式,因为它干净、好卸载、能随时重置环境。一条命令就能跑起来:
bash复制docker run -d -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home --name jenkins jenkins/jenkins:lts-jdk17
这条命令干了什么?我把关键参数拆开说:
-d表示后台运行;-p 8080:8080把容器内的8080端口映射到宿主机,以后你访问http://localhost:8080就是Jenkins;-v jenkins_home:/var/jenkins_home是数据卷,它的作用是让Jenkins的配置和数据不随容器删除而丢失,这个很重要,不然你辛辛苦苦配好的环境,容器一删全没了;jenkins/jenkins:lts-jdk17是带JDK 17的长期支持版镜像。如果你是Java工程师,会看到这个镜像本身就内置了JDK,能省掉不少麻烦。
如果你出于业务习惯或者之后要模拟生产环境,用原生包安装也没问题。Ubuntu下先用命令导入GPG密钥和软件源,再安装就行:
bash复制sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins
原生包安装的好处是Jenkins作为系统服务管理,开机自启,日志在/var/log/jenkins/jenkins.log,查询起来比较方便。但它的缺点也明显:升级容易引发依赖冲突,卸载不干净的时候会留下各种残留文件。这里我不给标准答案,你自己根据需要选。
2.3 初始化配置:解锁管理员、插件安装建议
无论用哪种方式安装,启动完成后都需要初始化。Jenkins会给你一个解锁密码,页面提示路径一般是在安装日志或容器日志里。如果是Docker启动,可以执行:
bash复制docker logs jenkins
找到那段日志里类似Jenkins initial setup is required. An admin user has been created and a password is generated的提示,密码就在下面的******里。
输入初始密码后,进入插件安装界面。这里我强烈建议你选择“安装推荐的插件”,别选“选择插件来安装”。原因很现实:新手根本不知道自己需要哪些插件,而推荐列表已经覆盖了Git、Pipeline、Email通知等常用的核心插件。等你在实战中遇到缺某个插件的情况,再去“系统管理—插件管理”里补装也不迟。
还有一步容易忽略:创建管理员账号。很多人图省事,直接用默认admin账号,但初始admin有一个随机密码,重启后容易忘记,而且你也不知道密码存在哪。这里我建议你哪怕多花一分钟,也创建一个自定义的管理员账号。后续登录、配置都清爽得多。
到这里,15分钟基本还剩两三分钟,你的Jenkins已经有了一个可以登录的界面。没有出现启动失败,没有插件安装报错,已经成功了一大半。
3. 基础配置与凭据管理:10分钟搞定“钥匙”和“门锁”
页面能打开只是第一步,真正让Jenkins干活,你还得告诉它两件事:构建环境在哪,代码仓库怎么访问。这就像你要让一名新员工开始工作,总得先给他工位、给他门禁卡吧。
3.1 系统设置里的关键项
进入“Dashboard→系统管理→系统配置”,你会看到一长串配置项。别慌,这一小时里你只需要关心几个关键的。
第一个是全局属性。如果你需要给所有构建任务统一注入环境变量,这里就能配置。比如有些公司会在Jenkins里定义统一NPM源地址,那么每次构建脚本拉取依赖时,就不需要再在脚本里写死这些参数了。
第二个是JDK和Git的位置。在“全局工具配置”页面里,你可以配置多个JDK路径和Git路径。如果你用Docker启动的Jenkins容器,这些工具可能已经预置好了。如果是原生安装,一般Git也会在系统里。我一般习惯在这个页面里显式配置一个JDK名称,比如“JDK11”,路径指向系统安装的JDK目录。为什么要显式配置?因为在Pipeline脚本里你可能会写jdk 'JDK11'这样的代码,如果Jenkins环境里没有这个名字,整个构建过程会直接报错。
第三个是邮件通知。这个稍显复杂,因为它需要你配置SMTP服务器、账号密码、默认发件人等一堆信息。这一小时我不建议你碰它,但你要知道它在“系统管理—系统配置”最下方。等以后构建失败时需要自动报警,再回来配。
3.2 凭据管理怎么做
凭据是Jenkins体系里比较抽象的一个概念。说人话就是:当你的构建任务需要访问Git仓库、登录服务器或者拉取私有镜像时,Jenkins必须保存一些账号密码或密钥文件,这些秘密信息就叫“凭据”。
你需要掌握的最少必要知识是:如何为Git仓库添加用户名密码或SSH密钥凭据。
操作路径是“Dashboard→系统管理→凭据管理→系统→全局凭据(不受限制)”。进去后点“添加凭据”。Kind选“Username with password”,然后填入你的Git账号密码。再为这个凭据起一个你认得出来的ID,比如gitlab-auth。这里我要特别指出一点:ID字段最好是明确的单词,而不是默认生成的GUID串。为什么?因为你在Pipeline脚本里引用凭据时,就是靠这个ID来定位的。一个可读性强的ID能让团队里其他人看到脚本就明白你在引用什么。
如果你用的是SSH协议访问Git仓库,凭据类型选“SSH Username with private key”,然后把私钥内容粘贴进去。我个人的习惯是优先用SSH密钥,因为企业里的GitLab或者内网Git系统,多数情况下只开放SSH协议。账号密码方式偶尔会因为密码过期或开启了两步验证导致认证失败,相比之下密钥方式更稳定。
这里的10分钟规划是:3分钟理解页面结构,5分钟添加一套凭据,2分钟检查一下Jenkins能否成功连接代码仓库。怎么检查?在凭据添加完成后,你可以先手动克隆一下仓库试试,或者等你创建构建任务后通过Pipeline脚本验证。
4. 创建你的第一条流水线:20分钟跑通构建流程
这是整篇文章的高潮部分,也是你真正感受到Jenkins魅力的地方。前面所有铺垫,都是在为这一步服务。
4.1 普通构建任务与流水线任务的区别
Jenkins里有多种项目类型。刚接触的人最容易困惑的是“Freestyle project”和“Pipeline”。我直接给你结论:学Pipeline就对了。
Freestyle project是传统方式,通过网页表单配置“源码管理”“构建步骤”等,好处是所见即所得,坏处是一旦构建流程稍复杂,表单就像迷宫一样,而且整个配置没办法作为代码管理起来。Pipeline则把构建流程写成脚本文件(Jenkinsfile),这段脚本可以存在Git仓库里,每次构建读取它。
为什么这套思路更好用?想象一下这个场景:你的构建流程从“拉代码→编译”变成“拉代码→编译→跑测试→打包镜像→推送到内网仓库”,如果用的是网页表单,你需要打开Jenkins后台逐个修改;如果用的是Pipeline,改脚本文件后提交,代码评审通过就是一次配置变更,整个过程有迹可循。这就是持续集成发展到后面所追求的“Pipeline as Code”。
对于一小时学习,Pipeline也没比Freestyle难多少。你只需要理解它的核心语法,剩下的可以边写边查。
4.2 一条最基础的Pipeline脚本拆解
Pipeline脚本使用的是Groovy语言,但你不必系统学习Groovy,只要掌握几个固定结构,就能完成大部分工作。
下面这段是我一直用来给新同事演示的最简脚本,保存为Jenkinsfile放在项目根目录:
groovy复制pipeline {
agent any
environment {
PROJECT_NAME = "demo-app"
}
stages {
stage('拉取代码') {
steps {
echo "代码已经从仓库拉取并进入工作目录"
sh 'ls -la'
}
}
stage('执行构建') {
steps {
echo "开始构建 ${PROJECT_NAME}"
sh 'make build'
// 如果你用的是Java项目,也可以替换为:
// sh 'mvn clean package -DskipTests'
}
}
stage('收集产物') {
steps {
archiveArtifacts artifacts: '**/target/*.jar', allowEmptyArchive: true
}
}
}
post {
success {
echo "构建成功"
}
failure {
echo "构建失败,请检查日志"
}
}
}
我逐段解释一下:
pipeline是根节点,表示整段脚本是一个流水线定义;agent any表示让Jenkins任意一个可用的执行节点来跑这条流水线。如果是单机安装,就是本机执行;environment里定义环境变量,后面用${PROJECT_NAME}引用;stages里面定义多个stage,每个stage负责一个阶段。每个阶段里写具体的steps步骤;sh步骤表示执行一条Shell命令。echo则是打印日志。注意Jenkins里所有命令的执行工作目录默认是当前构建的工作空间,不是脚本存放的目录,这一点很多新手会弄混;archiveArtifacts是收集构建产物,比如Java项目将构建出的jar包归档起来,方便后续在Jenkins页面上直接下载;post块里根据构建结果做不同处理,我现在写的只是打印日志,实际场景里可以在这里发邮件通知。
为什么我不在脚本里写复杂的登录远程主机、部署环节?因为一小时里最重要的是让你看到一条流水线的“骨架”,以及理解每个阶段发生了什么。复杂流程都是在这些基础结构上慢慢加码的。
4.3 如何新建这个流水线任务
现在你已经在页面上,跟着我操作一遍。点击“Dashboard→New Item”,输入一个任务名称,比如build-demo,选择“Pipeline”类型,点击确定。
在任务配置页面中,直接找到“Pipeline”区域:
- 在“Definition”下拉框里选择“Pipeline script”;
- 如果你想把脚本存在代码仓库,选择“Pipeline script from SCM”,然后在“Script Path”里填
Jenkinsfile。这一小时里我建议你先用第一种方式,直接在文本域里粘贴脚本,方便调试。
粘贴完后点击“保存”。回到任务主页,点击左侧“立即构建”。你会看到一个新的Build编号开始转圈。
点击进入这个构建,点击“Console Output”,就能看到流水线实时日志。如果一切正常,你会看到各阶段依次打勾通过。我至今还记得自己第一次看到五六个阶段全部变绿时的兴奋感,那种“原来持续集成也没那么神秘”的踏实感,正是你想通过这篇教程找到的东西。
5. 实战验证:15分钟让一条真实流水线跑起来
学到这里,你可能会觉得Pipeline脚本也不难。但纸上得来终觉浅,光看文章不操作,过一周就忘得一干二净。下面设计一个完整的模拟项目实战,你跟着做一遍就知道自己在哪个环节还有缺口。
5.1 准备一个模拟项目作为试验田
先说准备什么。我建议你在自己的Git仓库(比如GitLab或GitHub即可)里,新建一个名为jenkins-demo的仓库,在里面放一个最简单的待构建项目。作为演示,我推荐用最简单的HTML静态页面项目,构建过程就是压缩页面文件、生成一个带时间戳的产物包。这样你不用准备复杂的编译环境,可以把注意力集中在Jenkins本身上。
项目结构大致是这样:
code复制jenkins-demo/
├── src/
│ └── index.html
└── Jenkinsfile
index.html内容随意,写一行h1标签即可。Jenkinsfile内容可以直接用上一节那段脚本,但把构建命令换成压缩命令。为了方便跨平台,我习惯用tar命令:
groovy复制stage('打包静态资源') {
steps {
sh 'tar -czf demo-site.tar.gz src/'
}
}
这样做的意义是什么?你通过一个极简的项目,就能看到Jenkins从代码仓库拉取内容、进入工作区执行命令、最终把产物归档的完整闭环。以后你只要把构建命令换成mvn package或者是npm run build,静态页面演示与真实后端构建之间,差别就只剩一条命令而已。
5.2 从创建任务到成功构建的一次完整走查
现在你跟着我一步一步操作。第一步,在Jenkins上新建一个Pipeline任务,命名为static-site-demo。第二步,在Pipeline配置里,先选择Pipeline script from SCM,这样更能模拟真实团队的协作方式。填入你的Git仓库地址,选择之前添加的凭据,分支填main(或master),Script Path填Jenkinsfile。
第三步,点击保存后,回到项目页面,点击“立即构建”。第四步,打开这次构建的控制台日志,观察输出。
我在带人走查时,经常会在这一步遇到一个情况:构建开始后,日志里显示拉取代码失败,提示“Failed to connect to repository”。这时候别急,先回到凭据管理,检查一下凭据的账号有没有包含正确的仓库访问权限。或者点开日志中红色报错部分,查看更底层的异常信息。常见的无非是用户名密码错误、仓库路径不对、SSH密钥没有添加到Git服务器后台。排查方法也很直接:先在本地终端里用相同凭据手动拉一次代码,能拉通则问题一定在Jenkins侧,比如Job里配置的仓库URL与凭据类型不匹配。
如果一切顺利,日志最后几行会显示Finished: SUCCESS。你就完成了一次真正的持续集成构建。此时,在构建页面左侧点击“已归档的工件”,能看到你打包出的demo-site.tar.gz。这就算是把构建产物成功保留了下来。
5.3 让构建自动化:一句POST JSON就能触发
手动点击“立即构建”是入门,但CI/CD的核心价值在于自动化。你可以通过访问http://localhost:8080/job/static-site-demo/build(POST请求)来触发一次构建,配合Git服务器里的Webhook,就能实现代码提交后自动构建。
这里必须注意一个安全细节:Jenkins默认是需要登录才能操作的,所以你直接用浏览器访问上述地址,往往会被重定向到登录页。为了触发自动化,一般需要创建一个专供API调用的用户,并给该用户分配构建权限,然后在请求里带上基本认证信息。
用curl演示就是:
bash复制curl -u your-api-user:your-api-token -X POST http://localhost:8080/job/static-site-demo/build
其中your-api-token不是在Jenkins登录密码,而是该用户详情页里的“API Token”。这个Token要妥善保管,不要顺手提交到代码仓库。我在早期出现过一次把Token写进测试脚本并推到Git仓库的情况,后来只能一遍遍发公告要求同事紧急改密码。从那以后,我所有测试脚本里的凭据都是从环境变量或凭据管理里读取的,任何代码里都找不到明文密钥。
6. 常见问题与排查技巧实录
最后这部分,我整理了你在一小时实操中最可能遭遇的典型问题。这些问题我几乎每次带人都会遇到,如果你踩中了,直接对照解决即可。
6.1 插件下载慢、安装失败怎么办
国内网络环境下,Jenkins默认插件源访问会很吃力。处理方法有两种。第一种是在“插件管理→高级”里,把“Update Site”的URL换成国内镜像源。这是最直接的提速方式。第二种是如果用Docker方式安装,你可以在启动时挂载配置目录,预先在hudson.model.UpdateCenter.xml文件里把镜像地址替换掉。注意修改后一定要重启Jenkins,否则不会生效。
插件安装失败还有一个隐性原因:插件之间存在依赖兼容关系,某些插件需要更高版本的Jenkins。如果安装中途报错,建议优先去插件详情页查看“Required Core”版本是否与当前Jenkins一致。没必要为了某个花哨插件去升级整个Jenkins,除非你确认升级风险可控。
6.2 构建一直停在“Waiting for next available executor”
看到这个状态,很多新手第一反应是Jenkins卡了,或者系统资源不足。你上网搜,会看到各种讨论,但最可能的原因是:当前没有可用的执行节点(Executor)。
如果你这是单机安装,进入“系统管理→节点管理”,看看“内置节点”的“执行器数量”是否为0。我见过很多安装教程让你把执行器数量设为0“避免并发”,结果自己回头就忘了,一构建就排队。
一般的建议是内置节点保留2个执行器。如果你需要重度构建,可以再增加节点。对于入门来说,2个足够。
6.3 从“Console Output”里看不到任何有用的报错信息
有两种情况:一种是构建还没开始就失败,日志里只有Error两个字,这时候你需要点击“系统管理→系统日志”,看Jenkins主进程有没有抛异常。另一种是脚本确实执行了,但报错被淹没在大量输出里。我有个习惯是在Jenkinsfile的每个关键阶段都加上echo,就像在代码里留下索引一样,日志一长你也能快速定位到是哪个阶段出了问题。
6.4 凭据认证失败:三条必查清单
凭据失败无疑是最消耗信心的。我把它常出的问题整理成一个检查表,请你对照使用:
| 排查方向 | 具体检查点 |
|---|---|
| 凭据内容 | 用户名是否填错?密码/Token是否已过期?Git仓库账号权限是否包含代码拉取权限? |
| 仓库地址 | 使用的是HTTPS还是SSH?SSH地址必须以git@开头;HTTPS地址是否漏掉了.git后缀? |
| 凭据ID | Job中引用的地址里的凭据ID是否与凭据管理里的完全一致?大小写是否写错? |
如果这三项都查过还是不行,那就回到终端手动执行一次克隆操作,验证是不是Git仓库侧的业务权限配置问题。例如某些企业Git系统要求特定IP段或特定时间段才能访问,这种情况就不是Jenkins能解决的了。
6.5 我踩过的坑与经验总结
这篇文章里涉及的坑,几乎都是我实际踩过或者我亲眼看着同事踩过的。最后我再分享几个贯穿全程的小心得,可能比具体操作步骤更有价值。
第一,别小看环境变量的作用。我见过很多人的Jenkinsfile里硬编码着一堆路径和仓库地址,换一台机器就全都跑不起来。如果你从一开始就习惯用environment或Jenkins的“全局属性”去管理这些变量,以后环境迁移会轻松很多。
第二,构建脚本要能在本地独立运行。我经常碰到来求助的同事,他的Jenkins脚本里依赖了某个只有Jenkins机器上才有的环境变量或者系统路径,导致本地完全没法复现。真的强烈建议你在把脚本写进Jenkins之前,先在本地终端里手动执行一遍同样的命令,确认可行再提交。请相信我这句忠告,能帮你省掉无数“为什么Jenkins上报错但我本地是好的”的排查时间。
第三,学习Jenkins最好的方式是拆解别人的项目。你在GitHub上搜索Jenkinsfile,会发现大量开源项目已经把各种场景的写法摆在你的面前。花一个晚上读十份不同的Jenkinsfile,比啃一本工具书更有效。看看别人是怎么组织stage的,怎么处理多分支的,怎么做构建后通知的。模仿几次,你就不再是“会用Jenkins”,而是“会设计流水线”了。
我记得曾有位某开发者在听过这套入门方法后,回去用一周时间把公司零散的构建脚本统一成了一套标准的Pipeline框架。他说自己做的无非就是把所有阶段拆得足够小、把可变参数都抽到环境变量里、把构建产物明确归档。这三件事,恰恰都是从一口技术里最先学到的。Jenkins的入门门槛真的没有想象中那么高,你唯一要做的,就是给自己一小时,安静地动手跑通一次全流程。
