Jenkins 基础(2):核心基础篇 —— 吃透项目配置与Pipeline初体验
在上一篇教程中,我们成功搭建了 Jenkins 环境,完成了插件安装和基础的管理员配置,实现了让 Jenkins “跑起来”的目标。但对于一个强大的 CI/CD 引擎来说,这仅仅是拿到了大门的钥匙。很多新手在面对 Jenkins 繁杂的配置项和满屏的英文术语时,往往会感到无从下手。
本篇我们将深入 Jenkins 的腹地,系统地梳理核心配置,拆解自由风格项目(Freestyle Project)的各大模块,并带你初识 Jenkins 的灵魂功能 —— Pipeline(流水线)。通过本文大量详实的实战案例,你将真正实现从“能跑”到“会用”的进阶。
一、开篇:从“能跑”到“会用”,掌握Jenkins核心能力
抛开那些边缘功能,Jenkins 的核心能力无外乎解决以下三个核心问题:
- 环境与工具管理:代码在哪里拉?用什么工具编译?JDK、Maven、Node.js 等多版本环境怎么调度与隔离?
- 任务编排(Job):什么时候触发构建?构建过程分为哪几步?构建成功或失败后通知谁?
- 节点调度(Node):任务是在主节点上跑,还是分发给其他机器(从节点)跑?如何实现分布式构建?
掌握了这三块内容,你也就掌握了 Jenkins 80% 的日常使用场景。
二、Jenkins系统核心配置详解
进入 Jenkins 的 Manage Jenkins(系统管理)页面,这里是整个 Jenkins 实例的中枢神经。我们将重点关注其中最核心的四个模块。
2.1 系统配置页整体结构梳理
点击左侧导航栏的 Manage Jenkins,你会看到配置项被分成了几大类:
- System Configuration(系统配置):包含系统全局配置(System)和全局工具配置(Global Tool Configuration)。
- Security(安全):管理用户权限、凭据(Credentials)等。
- Status Information(状态信息):系统日志、负载统计等。
- Troubleshooting(故障排查):管理旧数据等。
- Tools and Actions(工具和动作):插件管理(Plugins)、节点管理(Nodes and Clouds)。
对于初学者,日常打交道最多的就是系统全局配置、全局工具配置、凭据管理和节点管理。
2.2 全局工具配置(重点):JDK、Maven、Git、Node环境配置
Global Tool Configuration(全局工具配置) 是重中之重。它告诉 Jenkins:你的 JDK 安装在哪里?Git 命令在哪里?Maven 怎么调用?
自动安装 vs 本地路径Jenkins 支持勾选
Install automatically(自动安装),但生产环境中,由于网络原因或版本统一的要求,强烈建议取消勾选自动安装,直接指定宿主机(或容器)上已安装好的工具绝对路径。这能避免因为网络波动导致工具下载失败而引发的构建中断。
实战配置示例:
-
JDK 配置:
- 别名(Name):
jdk-11(建议带上版本号,方便后续在多环境时引用,例如jdk-8,jdk-17) - JAVA_HOME:填写服务器上的绝对路径,例如
/usr/lib/jvm/java-11-openjdk-amd64。
- 别名(Name):
-
Maven 配置:
- 别名(Name):
maven-3.8.8 - MAVEN_HOME:
/opt/maven/apache-maven-3.8.8
- 别名(Name):
-
Git 配置:
- 通常保持默认的
git即可,前提是服务器的环境变量($PATH)里能直接执行git命令。如果不在默认路径,需填写绝对路径,如/usr/local/bin/git。
- 通常保持默认的
-
Node.js 配置(需提前在插件管理中安装 NodeJS Plugin):
- 别名:
node-16 - 安装目录:
/opt/nodejs/node-v16.14.0-linux-x64
- 别名:
2.3 全局安全配置:用户权限与 RBAC 实战
默认情况下,Jenkins 允许任何登录用户做任何事,这在团队协作中是非常危险的。进入 Security -> Global Security 进行配置。
- Authentication(认证):通常选择
Jenkins’ own user database(Jenkins专有用户数据库)。 - 匿名访问:务必确保
Allow anonymous read access(允许匿名用户拥有只读权限)被取消勾选,防止未授权用户查看敏感的构建日志或代码信息。
RBAC 权限控制实战企业中最常用的是基于角色的权限控制。请先在插件市场安装 Role-based Authorization Strategy 插件。
安装插件后,在授权策略中选择 Role-Based Strategy。接着进入 Manage and Assign Roles:
-
Manage Roles(管理角色):
- Global roles(全局角色):比如创建一个
developer角色,只勾选Overall -> Read权限(仅允许登录和查看控制台)。 - Item roles(项目角色):比如创建一个
dev-projects角色,Pattern(正则匹配)写dev-.*,并勾选Job -> Build, Read, Workspace。这意味着拥有该角色的用户,只能看到和构建以dev-开头的项目。
- Global roles(全局角色):比如创建一个
-
Assign Roles(分配角色):
- 将张三(开发者)分配给
developer全局角色和dev-projects项目角色。这样张三登录后,就不会看到生产环境(如prod-开头)的任何项目,也无法进入系统管理修改配置。
- 将张三(开发者)分配给
2.4 节点管理:主从架构概念与 SSH 节点接入
Jenkins 原生支持 Master-Slave(主从)架构。
- Master(主节点):负责管理配置、调度任务、分发构建,不建议在 Master 节点直接执行繁重的构建任务,以免拖垮调度中心。
- Agent/Slave(从节点):真正干活的机器。
实战:通过 SSH 接入一个 CentOS 从节点
- 在
Manage Jenkins -> Nodes中点击New Node,输入名称(如build-node-01),选择Permanent Agent。 - Remote root directory(远程工作目录):填入
/opt/jenkins-agent(节点上存放代码和工作空间的路径)。 - Labels(标签):填入
centos-build。以后可以在任务中指定只在这个标签的机器上运行。 - Launch method(启动方式):选择
Launch agents via SSH。- Host:填写从节点的 IP(如
192.168.1.100)。 - Credentials:添加一个 SSH Username with private key 的凭据,填入从节点 root 用户的私钥。
- Host Key Verification Strategy:测试环境下可选择
Non verifying Verification Strategy(不验证主机密钥)以快速连通。
- Host:填写从节点的 IP(如
保存后,点击 Launch agent,Jenkins 就会自动通过 SSH 登录到该机器,下载并启动 agent.jar,你的分布式构建集群就初具雏形了。
三、自由风格项目全玩法拆解
了解了系统配置,我们来创建一个最传统的 Freestyle Project(自由风格项目)。虽然现在推崇 Pipeline,但自由风格项目直观的图形化界面,是理解 Jenkins 任务执行逻辑的最佳途径。
点击 New Item -> 输入任务名称(如 dev-freestyle-demo) -> 选择 Freestyle project。
3.1 核心配置模块全景解析
进入项目配置页,你会看到以下核心选项卡:
- General(通用):描述项目信息、设置参数化构建、丢弃旧的构建历史等。
- Source Code Management(源码管理):配置 Git/SVN 仓库地址和分支。
- Build Triggers(构建触发器):定义任务在什么条件下被触发执行。
- Build Environment(构建环境):构建前的准备工作,如注入密码、清空工作空间。
- Build Steps(构建步骤):真正的核心动作,执行 Shell 脚本或调用 Maven。
- Post-build Actions(构建后操作):构建完成后的收尾工作,如归档产物、发送邮件。
3.2 实战:参数化构建 (Parameterized Build)
很多时候我们需要在构建时传入变量(比如选择发布哪个分支,或者发布哪个环境)。
在 General 中勾选 This project is parameterized(参数化构建过程):
- 添加一个 Choice Parameter(选项参数):
- Name:
ENV - Choices:
dev换行test换行prod - Description:
请选择要发布的部署环境
- Name:
- 添加一个 String Parameter(字符串参数):
- Name:
BRANCH_NAME - Default Value:
main - Description:
请输入要打包的Git分支
- Name:
在后续的构建步骤中,你就可以通过 ${ENV} 和 ${BRANCH_NAME} 来引用这些变量了。
3.3 源码管理与凭据最佳实践
在 Source Code Management 中选择 Git:
- Repository URL:填入代码仓库地址(如
http://gitlab.com/mygroup/myproject.git)。 - Credentials:点击 Add,添加可以访问该仓库的凭据。
- Branches to build:将默认的
*/master改为我们上面定义的变量${BRANCH_NAME}。
安全提示不要在配置页面或者 Shell 脚本中到处手填密码明文!所有的密码、私钥、Token 都应该统一在 Manage Jenkins -> Credentials 中创建,在使用时通过下拉框选择或在环境中安全注入。
3.4 构建触发器:Cron 表达式怎么写?
Jenkins 支持多种触发方式,最常用的有两种:
-
Build periodically(定时构建):不管代码有没有更新,到了时间就强制构建。类似 Linux 的 Crontab。
- 语法示例:
H 2 * * *(每天凌晨 2 点左右执行一次)。 - 语法示例:
H/15 * * * *(每 15 分钟执行一次)。 - 注:Jenkins 推荐使用
H(Hash) 而不是固定的数字(如0),这能让 Jenkins 自动打散同一时间的并发任务,降低系统瞬间负载。
- 语法示例:
-
Poll SCM(轮询SCM):定期去代码仓库看有没有新提交,如果有才触发构建。
- 语法同上,例如
H/5 * * * *表示每 5 分钟检查一次 Git 仓库。 - 虽然好用,但高频轮询会增加 Git 服务器的压力,企业中更推荐使用 Gitlab Webhook 实现主动推送触发。
- 语法同上,例如
3.5 构建步骤:Shell 脚本实战
在 Build Steps 中选择 Execute shell。这里是真正干活的地方。我们可以结合前面的参数化变量写一段简单的部署逻辑:
#!/bin/bash# 开启遇到错误即退出的严格模式set -e
echo "===================================="echo "开始执行构建任务..."echo "目标分支: ${BRANCH_NAME}"echo "部署环境: ${ENV}"echo "当前工作目录: $(pwd)"echo "===================================="
# 假设这是一个 Node.js 项目echo "1. 安装依赖..."npm install --registry=https://registry.npmmirror.com
echo "2. 开始打包..."# 根据选择的环境变量执行不同的打包命令npm run build:${ENV}
echo "3. 打包完成,准备分发..."# 将产物压缩tar -zcvf dist-${ENV}.tar.gz ./dist/
echo "===================================="echo "构建成功!"3.6 构建后操作:邮件与产物归档
在 Post-build Actions 中:
- Archive the artifacts(归档成品):输入
*.tar.gz。这会在 Jenkins 任务页面保留这个压缩包,方便用户直接点击下载。 - E-mail Notification:输入接收人的邮箱地址,勾选
Send e-mail for every unstable build。当构建失败时,自动将失败日志发送给开发者。(需提前在系统配置中配置好 SMTP 服务)。
四、Pipeline初体验:流水线才是Jenkins的灵魂
随着微服务架构的普及和项目复杂度的提升,自由风格项目暴露出很多问题:配置分散难以追踪(全是零散的 Shell 框)、无法进行版本控制(配置存在 Jenkins 数据库里)、难以实现复杂的条件分支。于是,Pipeline(流水线) 诞生了。
4.1 什么是Pipeline?与自由风格项目的核心区别
Pipeline 是一套运行在 Jenkins 上的工作流框架,它允许你使用代码(Groovy 脚本)来定义整个构建、测试、部署流程,即所谓的 Pipeline as Code。
| 对比维度 | Freestyle Project (自由风格) | Pipeline (流水线) |
|---|---|---|
| 配置方式 | Web 页面点选、填表、填脚本块 | 纯代码编写(通常命名为 Jenkinsfile) |
| 版本控制 | 难,配置丢失难以找回 | 容易,Jenkinsfile 与源码一起提交进 Git 仓库 |
| 复杂逻辑 | 很难实现条件判断、循环、并行 | 完全支持编程语言特性,轻松实现并行构建和环境判断 |
| 容错能力 | Jenkins 服务重启后任务直接失败中断 | 支持服务重启后恢复运行,支持人工审批(Input)暂停 |
4.2 两种语法选型:声明式 vs 脚本式
Pipeline 支持两种语法:
- Declarative Pipeline(声明式):较新的语法,结构化、严格、易读。它提供了预定义的块(如
stages,steps,post),上手门槛低,强烈建议小白和大多数团队优先选择声明式。 - Scripted Pipeline(脚本式):传统的语法,就是纯粹的 Groovy 代码,极其灵活,但学习成本高,没有严格的结构限制。
一个标准的声明式 Pipeline 骨架及核心指令解析如下:
pipeline { // 1. agent: 指定在哪里执行。any(任意节点), none(不在全局分配), label 'centos-build'(指定标签) agent any
// 2. environment: 定义全局环境变量 environment { APP_NAME = 'my-awesome-app' // 使用 credentials 注入机密信息,避免明文泄露 DB_PASS = credentials('mysql-prod-password') }
// 3. parameters: 定义参数化构建参数(代替自由风格的图形化配置) parameters { choice(name: 'ENV', choices: ['dev', 'test', 'prod'], description: '部署环境') string(name: 'BRANCH', defaultValue: 'main', description: '代码分支') }
// 4. stages: 阶段集合,包含了整个流水线的所有阶段 stages { stage('拉取代码') { steps { echo "拉取分支: ${params.BRANCH}" } }
stage('编译构建') { // 5. when: 条件判断,满足条件才执行该 stage when { environment name: 'ENV', value: 'prod' } steps { echo '当前是生产环境,执行特定的生产编译逻辑...' } } }
// 6. post: 无论流水线结果如何,最终都会执行的收尾动作 post { always { echo '总是执行:清理工作空间...' cleanWs() } success { echo '只有成功才执行:发送钉钉/邮件通知...' } failure { echo '只有失败才执行:收集错误日志并告警...' } }}4.3 进阶指令:让你的流水线更健壮
除了上述基础骨架,声明式 Pipeline 还提供了非常强大的 options 指令,用于控制流水线的全局行为。在企业实战中,以下三个配置几乎是必填项:
pipeline { agent any
// options 定义在 pipeline 顶层,控制整体行为 options { // 1. 超时控制:防止构建卡死(比如 npm install 挂起),浪费节点资源 timeout(time: 1, unit: 'HOURS')
// 2. 失败重试:遇到网络抖动等偶发错误时,自动重试指定次数 retry(3)
// 3. 时间戳:在控制台输出的每一行日志前加上时间,排查耗时神器 timestamps()
// 4. 禁用并发:禁止同一个项目同时跑多次构建,防止资源竞争或部署冲突 disableConcurrentBuilds() } // ... stages}4.4 复杂流程控制:并行构建与人工审批
传统的自由风格项目只能串行执行,而 Pipeline 轻松支持并发执行(Parallel)和人工干预(Input)。
场景一:并行测试。前端和后端的单元测试可以同时跑,节约整体构建时间。
stage('自动化测试') { parallel { // 开启并行块 stage('前端测试') { steps { echo "正在运行 Jest 单元测试..." sleep 5 // 模拟耗时 } } stage('后端测试') { steps { echo "正在运行 JUnit 测试..." sleep 10 } } }}场景二:人工审批发布。测试环境部署后,QA 需要介入测试。测试通过后,运维人员在 Jenkins 界面点击“批准”,才允许部署到生产环境。
stage('部署到生产环境') { steps { // 流水线会在这里暂停,等待人工点击 input message: '测试是否已通过?是否确认发布到生产环境?', submitter: 'admin,ops-manager' // 只有特定角色的用户能点击批准
echo '审批通过,开始发布生产环境...' }}4.5 神器入门:Pipeline语法生成器怎么用
“既然 Pipeline 是写代码,那我要是不知道怎么用 Git 拉代码,或者不知道怎么发邮件的 Groovy 语法怎么办?”
完全不用慌,因为没人能记住所有的语法。Jenkins 提供了一个神器:Snippet Generator(片段生成器)。
在 Pipeline 配置页面的底部,或者项目视图的左侧菜单中,点击 Pipeline Syntax。
进入片段生成器后:
- Sample Step 下拉框选择你要做的动作(比如
git: Git,或者sh: Shell Script)。 - 像自由风格项目一样,在界面上直观地填入仓库 URL 和凭据下拉框。
- 点击 Generate Pipeline Script。
- Jenkins 会自动帮你生成对应的 Groovy 代码(例如
git credentialsId: 'xxx', url: 'http://xxx.git'),你直接复制粘贴到 Jenkinsfile 的steps块中即可!
插件支持度与 Replay 功能
- 几乎所有你安装的 Jenkins 插件(如 Docker、Kubernetes、SonarQube),只要它们支持 Pipeline,都会在 Snippet Generator 的下拉框中提供生成模板。
- 调试 Pipeline 时,每次都要改代码并提交到 Git 极其麻烦。你可以使用左侧菜单的 Replay(重放) 功能,直接在网页里临时修改代码并运行测试,调通后再统一提交到代码库。
五、动手实操:用Pipeline打造企业级Maven自动化流水线
结合上面的所有知识点(包括参数化、环境变量、超时控制、并行、人工审批等),我们来写一个真正有实用价值、贴近企业真实场景的声明式 Pipeline:
- 新建项目 -> 选择
Pipeline-> 命名为maven-enterprise-pipeline。 - 在
Pipeline选项卡的Definition中选择Pipeline script。 - 填入以下脚本:
pipeline { agent any
// 全局选项配置:超时、时间戳、禁用并发 options { timeout(time: 30, unit: 'MINUTES') timestamps() disableConcurrentBuilds() }
// 引用全局工具配置中的名称 tools { maven 'maven-3.8.8' jdk 'jdk-11' }
// 定义构建参数 parameters { choice(name: 'DEPLOY_ENV', choices: ['test', 'prod'], description: '发布环境') string(name: 'GIT_BRANCH', defaultValue: 'main', description: '需要构建的代码分支') booleanParam(name: 'SKIP_TESTS', defaultValue: false, description: '是否跳过单元测试') }
environment { // 定义项目相关的全局变量 PROJECT_URL = 'https://gitlab.com/example/my-java-app.git' CREDENTIAL_ID = 'my-gitlab-cred-id' }
stages { stage('1. Checkout') { steps { echo "开始拉取代码,目标分支: ${params.GIT_BRANCH}" git branch: "${params.GIT_BRANCH}", credentialsId: "${CREDENTIAL_ID}", url: "${PROJECT_URL}" } }
stage('2. Build & Test') { // 并行执行代码扫描与打包编译 parallel { stage('Code Scan') { steps { echo '执行 SonarQube 静态代码扫描...' sh 'sleep 3 && echo "SonarQube passed!"' } } stage('Maven Package') { steps { echo "开始 Maven 编译打包 (跳过测试: ${params.SKIP_TESTS})..." sh "mvn clean package -Dmaven.test.skip=${params.SKIP_TESTS}" } } } }
stage('3. Archive') { steps { echo '归档构建产物以便下载...' archiveArtifacts artifacts: 'target/*.jar', fingerprint: true } }
stage('4. Deploy Approval') { // 仅当环境选择 prod 生产环境时,才需要人工审批 when { environment name: 'DEPLOY_ENV', value: 'prod' } steps { input message: '警告:即将发布到生产环境!请确认是否继续?', submitter: 'admin' echo '审批通过,执行生产发布逻辑...' } } }
post { success { echo "🎉 构建与部署成功!(分支: ${params.GIT_BRANCH})" sh "echo '发送成功通知到钉钉研发群...'" } failure { echo "❌ 流水线失败!请检查日志。" sh "echo '发送报警邮件给对应开发人员...'" } always { echo "🧹 清理工作空间..." cleanWs() } }}保存后,点击 Build with Parameters。如果你选择了 prod 环境,流水线会在跑到 Deploy Approval 阶段时暂停并闪烁提示。此时必须有人工点击 Proceed 才能继续往下执行。这正是企业级发布流程中最关键的一环!
六、进阶探索:Jenkins Shared Library (共享库) 概念初探
随着公司内部项目越来越多,你会发现每个项目的 Jenkinsfile 看起来都差不多。如果有一天公司要求所有项目的 Maven 编译参数都加上 -X 打印调试信息,你需要去修改 100 个仓库里的 Jenkinsfile 吗?
这显然是不合理的。为了解决 Pipeline 代码冗余和复用问题,Jenkins 提供了 Shared Library(共享库) 机制。
什么是共享库?你可以把常用的流水线逻辑(如发邮件、拉代码、构建 Docker 镜像)封装成独立的 Groovy 方法,统一放在一个公共的 Git 仓库里。 各个项目的
Jenkinsfile只需要在头部引入这个共享库(@Library('my-shared-library') _),然后像调用本地函数一样调用公共方法。这使得你的流水线真正具备了模块化和工程化的能力。
关于 Shared Library 的具体开发与实战,我们将在后续的高级篇中详细探讨。
七、本篇核心知识点复盘
在本篇文章中,我们完成了一次 Jenkins 核心功能的深度游,并从图形化操作走向了代码化编排,总结如下:
- 环境是基石:
Manage Jenkins中的全局工具配置(JDK、Maven 等)是后续所有构建动作的前提,建议使用绝对路径而非自动安装。 - 安全与节点:通过 RBAC 插件实现了项目级别的权限隔离,理解了 Master-Slave 架构的理念,Master 负责调度,Agent 通过 SSH 接入负责干活。
- 自由风格是入门:通过拆解 Freestyle Project,我们理解了参数化构建、源码管理、Cron 触发器、构建步骤这套标准的 CI/CD 流程逻辑。
- Pipeline 是未来:深刻认识了 Pipeline as Code 的强大之处,掌握了声明式语法的核心骨架(
pipeline,agent,environment,parameters,stages,post)。 - 复杂流程控制:掌握了
options超时重试控制、parallel并行执行以及input人工审批等企业级高频指令。 - 善用工具:学会使用 Pipeline Syntax(片段生成器) 与 Replay(重放) 功能,极大降低了调试与上手的门槛。
掌握了这些,你已经具备了在企业中独立配置和维护复杂自动化构建任务的能力。
下一篇,我们将走出单机的 Java 环境,探讨如何将 Jenkins 与 Docker 深度结合,实现环境的彻底隔离,以及如何编写更加复杂的企业级多阶段容器化部署流水线。 敬请期待!