5267 字
26 分钟
Jenkins (2):核心基础篇 —— 吃透项目配置与Pipeline初体验

Jenkins 基础(2):核心基础篇 —— 吃透项目配置与Pipeline初体验#

在上一篇教程中,我们成功搭建了 Jenkins 环境,完成了插件安装和基础的管理员配置,实现了让 Jenkins “跑起来”的目标。但对于一个强大的 CI/CD 引擎来说,这仅仅是拿到了大门的钥匙。很多新手在面对 Jenkins 繁杂的配置项和满屏的英文术语时,往往会感到无从下手。

本篇我们将深入 Jenkins 的腹地,系统地梳理核心配置,拆解自由风格项目(Freestyle Project)的各大模块,并带你初识 Jenkins 的灵魂功能 —— Pipeline(流水线)。通过本文大量详实的实战案例,你将真正实现从“能跑”到“会用”的进阶。

一、开篇:从“能跑”到“会用”,掌握Jenkins核心能力#

抛开那些边缘功能,Jenkins 的核心能力无外乎解决以下三个核心问题:

  1. 环境与工具管理:代码在哪里拉?用什么工具编译?JDK、Maven、Node.js 等多版本环境怎么调度与隔离?
  2. 任务编排(Job):什么时候触发构建?构建过程分为哪几步?构建成功或失败后通知谁?
  3. 节点调度(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(自动安装),但生产环境中,由于网络原因或版本统一的要求,强烈建议取消勾选自动安装,直接指定宿主机(或容器)上已安装好的工具绝对路径。这能避免因为网络波动导致工具下载失败而引发的构建中断。

实战配置示例:

  1. JDK 配置:

    • 别名(Name):jdk-11(建议带上版本号,方便后续在多环境时引用,例如 jdk-8, jdk-17)
    • JAVA_HOME:填写服务器上的绝对路径,例如 /usr/lib/jvm/java-11-openjdk-amd64。
  2. Maven 配置:

    • 别名(Name):maven-3.8.8
    • MAVEN_HOME:/opt/maven/apache-maven-3.8.8
  3. Git 配置:

    • 通常保持默认的 git 即可,前提是服务器的环境变量($PATH)里能直接执行 git 命令。如果不在默认路径,需填写绝对路径,如 /usr/local/bin/git。
  4. 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:

  1. Manage Roles(管理角色):

    • Global roles(全局角色):比如创建一个 developer 角色,只勾选 Overall -> Read 权限(仅允许登录和查看控制台)。
    • Item roles(项目角色):比如创建一个 dev-projects 角色,Pattern(正则匹配)写 dev-.*,并勾选 Job -> Build, Read, Workspace。这意味着拥有该角色的用户,只能看到和构建以 dev- 开头的项目。
  2. Assign Roles(分配角色):

    • 将张三(开发者)分配给 developer 全局角色和 dev-projects 项目角色。这样张三登录后,就不会看到生产环境(如 prod- 开头)的任何项目,也无法进入系统管理修改配置。

2.4 节点管理:主从架构概念与 SSH 节点接入#

Jenkins 原生支持 Master-Slave(主从)架构。

  • Master(主节点):负责管理配置、调度任务、分发构建,不建议在 Master 节点直接执行繁重的构建任务,以免拖垮调度中心。
  • Agent/Slave(从节点):真正干活的机器。

实战:通过 SSH 接入一个 CentOS 从节点

  1. 在 Manage Jenkins -> Nodes 中点击 New Node,输入名称(如 build-node-01),选择 Permanent Agent。
  2. Remote root directory(远程工作目录):填入 /opt/jenkins-agent(节点上存放代码和工作空间的路径)。
  3. Labels(标签):填入 centos-build。以后可以在任务中指定只在这个标签的机器上运行。
  4. 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(不验证主机密钥)以快速连通。

保存后,点击 Launch agent,Jenkins 就会自动通过 SSH 登录到该机器,下载并启动 agent.jar,你的分布式构建集群就初具雏形了。

三、自由风格项目全玩法拆解#

了解了系统配置,我们来创建一个最传统的 Freestyle Project(自由风格项目)。虽然现在推崇 Pipeline,但自由风格项目直观的图形化界面,是理解 Jenkins 任务执行逻辑的最佳途径。

点击 New Item -> 输入任务名称(如 dev-freestyle-demo) -> 选择 Freestyle project。

3.1 核心配置模块全景解析#

进入项目配置页,你会看到以下核心选项卡:

  1. General(通用):描述项目信息、设置参数化构建、丢弃旧的构建历史等。
  2. Source Code Management(源码管理):配置 Git/SVN 仓库地址和分支。
  3. Build Triggers(构建触发器):定义任务在什么条件下被触发执行。
  4. Build Environment(构建环境):构建前的准备工作,如注入密码、清空工作空间。
  5. Build Steps(构建步骤):真正的核心动作,执行 Shell 脚本或调用 Maven。
  6. Post-build Actions(构建后操作):构建完成后的收尾工作,如归档产物、发送邮件。

3.2 实战:参数化构建 (Parameterized Build)#

很多时候我们需要在构建时传入变量(比如选择发布哪个分支,或者发布哪个环境)。

在 General 中勾选 This project is parameterized(参数化构建过程):

  • 添加一个 Choice Parameter(选项参数):
    • Name: ENV
    • Choices: dev 换行 test 换行 prod
    • Description: 请选择要发布的部署环境
  • 添加一个 String Parameter(字符串参数):
    • Name: BRANCH_NAME
    • Default Value: main
    • Description: 请输入要打包的Git分支

在后续的构建步骤中,你就可以通过 ${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 支持多种触发方式,最常用的有两种:

  1. Build periodically(定时构建):不管代码有没有更新,到了时间就强制构建。类似 Linux 的 Crontab。

    • 语法示例:H 2 * * * (每天凌晨 2 点左右执行一次)。
    • 语法示例:H/15 * * * * (每 15 分钟执行一次)。
    • 注:Jenkins 推荐使用 H (Hash) 而不是固定的数字(如 0),这能让 Jenkins 自动打散同一时间的并发任务,降低系统瞬间负载。
  2. Poll SCM(轮询SCM):定期去代码仓库看有没有新提交,如果有才触发构建。

    • 语法同上,例如 H/5 * * * * 表示每 5 分钟检查一次 Git 仓库。
    • 虽然好用,但高频轮询会增加 Git 服务器的压力,企业中更推荐使用 Gitlab Webhook 实现主动推送触发。

3.5 构建步骤:Shell 脚本实战#

在 Build Steps 中选择 Execute shell。这里是真正干活的地方。我们可以结合前面的参数化变量写一段简单的部署逻辑:

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核心骨架
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 指令,用于控制流水线的全局行为。在企业实战中,以下三个配置几乎是必填项:

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)。

场景一:并行测试。前端和后端的单元测试可以同时跑,节约整体构建时间。

parallel 并行构建示例
stage('自动化测试') {
parallel { // 开启并行块
stage('前端测试') {
steps {
echo "正在运行 Jest 单元测试..."
sleep 5 // 模拟耗时
}
}
stage('后端测试') {
steps {
echo "正在运行 JUnit 测试..."
sleep 10
}
}
}
}

场景二:人工审批发布。测试环境部署后,QA 需要介入测试。测试通过后,运维人员在 Jenkins 界面点击“批准”,才允许部署到生产环境。

input 人工审批示例
stage('部署到生产环境') {
steps {
// 流水线会在这里暂停,等待人工点击
input message: '测试是否已通过?是否确认发布到生产环境?',
submitter: 'admin,ops-manager' // 只有特定角色的用户能点击批准
echo '审批通过,开始发布生产环境...'
}
}

4.5 神器入门:Pipeline语法生成器怎么用#

“既然 Pipeline 是写代码,那我要是不知道怎么用 Git 拉代码,或者不知道怎么发邮件的 Groovy 语法怎么办?”

完全不用慌,因为没人能记住所有的语法。Jenkins 提供了一个神器:Snippet Generator(片段生成器)。

在 Pipeline 配置页面的底部,或者项目视图的左侧菜单中,点击 Pipeline Syntax。 进入片段生成器后:

  1. Sample Step 下拉框选择你要做的动作(比如 git: Git,或者 sh: Shell Script)。
  2. 像自由风格项目一样,在界面上直观地填入仓库 URL 和凭据下拉框。
  3. 点击 Generate Pipeline Script。
  4. Jenkins 会自动帮你生成对应的 Groovy 代码(例如 git credentialsId: 'xxx', url: 'http://xxx.git'),你直接复制粘贴到 Jenkinsfile 的 steps 块中即可!
插件支持度与 Replay 功能
  1. 几乎所有你安装的 Jenkins 插件(如 Docker、Kubernetes、SonarQube),只要它们支持 Pipeline,都会在 Snippet Generator 的下拉框中提供生成模板。
  2. 调试 Pipeline 时,每次都要改代码并提交到 Git 极其麻烦。你可以使用左侧菜单的 Replay(重放) 功能,直接在网页里临时修改代码并运行测试,调通后再统一提交到代码库。

五、动手实操:用Pipeline打造企业级Maven自动化流水线#

结合上面的所有知识点(包括参数化、环境变量、超时控制、并行、人工审批等),我们来写一个真正有实用价值、贴近企业真实场景的声明式 Pipeline:

  1. 新建项目 -> 选择 Pipeline -> 命名为 maven-enterprise-pipeline。
  2. 在 Pipeline 选项卡的 Definition 中选择 Pipeline script。
  3. 填入以下脚本:
实战:企业级 Maven 自动化流水线
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 核心功能的深度游,并从图形化操作走向了代码化编排,总结如下:

  1. 环境是基石:Manage Jenkins 中的全局工具配置(JDK、Maven 等)是后续所有构建动作的前提,建议使用绝对路径而非自动安装。
  2. 安全与节点:通过 RBAC 插件实现了项目级别的权限隔离,理解了 Master-Slave 架构的理念,Master 负责调度,Agent 通过 SSH 接入负责干活。
  3. 自由风格是入门:通过拆解 Freestyle Project,我们理解了参数化构建、源码管理、Cron 触发器、构建步骤这套标准的 CI/CD 流程逻辑。
  4. Pipeline 是未来:深刻认识了 Pipeline as Code 的强大之处,掌握了声明式语法的核心骨架(pipeline, agent, environment, parameters, stages, post)。
  5. 复杂流程控制:掌握了 options 超时重试控制、parallel 并行执行以及 input 人工审批等企业级高频指令。
  6. 善用工具:学会使用 Pipeline Syntax(片段生成器) 与 Replay(重放) 功能,极大降低了调试与上手的门槛。

掌握了这些,你已经具备了在企业中独立配置和维护复杂自动化构建任务的能力。

下一篇,我们将走出单机的 Java 环境,探讨如何将 Jenkins 与 Docker 深度结合,实现环境的彻底隔离,以及如何编写更加复杂的企业级多阶段容器化部署流水线。 敬请期待!

Jenkins (2):核心基础篇 —— 吃透项目配置与Pipeline初体验
https://www.6ixblog.site/posts/jenkins-2/
作者
Licwic
发布于
2026-08-10
许可协议
CC BY-NC-SA 4.0