4、Jenkins Pipeline基础:声明式Pipeline vs 脚本式Pipeline、Pipeline语法核心(agent/stages/steps)、第一个Pipeline脚本
好,咱们今天来聊聊 Jenkins Pipeline。说实话,Pipeline 是 Jenkins 的「灵魂」所在。如果你只会点「新建项目」然后填几个参数,那只能算刚入门。真正让 Jenkins 变得强大、可维护、可复用的,就是 Pipeline 脚本。
我个人习惯把 Pipeline 理解为「用代码写出来的构建流程」。你想想看,以前我们配 Jenkins 任务,全在 Web 界面上点来点去,项目一多,维护起来简直要命。Pipeline 的出现,说白了就是把整个 CI/CD 流程「版本化」了——你可以把脚本放到 Git 仓库里,跟代码一起管理。
声明式 Pipeline vs 脚本式 Pipeline
Jenkins 提供了两种 Pipeline 写法:声明式(Declarative) 和 脚本式(Scripted)。我刚开始接触时也纠结过该学哪个,后来发现——其实两个都得会,但入门阶段我强烈建议你先学声明式。
| 对比维度 | 声明式 Pipeline | 脚本式 Pipeline |
|---|---|---|
| 语法风格 | 结构化、严格、类似 DSL | 自由、类似 Groovy 脚本 |
| 学习曲线 | 平缓,容易上手 | 较陡,需要 Groovy 基础 |
| 代码检查 | 语法检查严格,出错早 | 运行时才能发现错误 |
| 适用场景 | 标准 CI/CD 流程 | 复杂逻辑、动态流程 |
| 可读性 | 高,非开发人员也能看懂 | 一般,需要理解 Groovy |
我在项目中遇到过不少团队,一开始图省事全用脚本式,结果后来维护的人换了,看着一堆 Groovy 代码直挠头。嗯,这里要注意:能用声明式解决的问题,就别上脚本式。声明式 Pipeline 就像给你画好了「格子」,你只需要往里面填内容就行。而脚本式呢,就像给你一张白纸——自由是自由,但画歪了也没人提醒你。
核心建议:新项目、新团队,一律从声明式 Pipeline 开始。等遇到需要动态生成 stage、复杂条件判断的场景,再考虑混用脚本式。
Pipeline 语法核心:agent / stages / steps
声明式 Pipeline 的骨架就三个关键词:agent、stages、steps。你只要搞懂这三个,就能写出 80% 的 Pipeline 脚本。
agent:你的代码跑在哪?
agent 指定了 Pipeline 或某个 stage 在哪个执行器上运行。说白了就是「这活儿谁来干」。
agent any:随便找个可用的节点跑agent none:全局不指定,每个 stage 自己定义agent { label 'linux' }:指定标签,比如只跑在 Linux 节点上agent { docker 'node:18' }:直接在 Docker 容器里跑,这个我特别喜欢用
我曾经踩过一个坑:全局设了 agent any,结果某个 stage 需要 Windows 环境才能编译,直接报错。后来我改成每个 stage 单独指定 agent,问题就解决了。
stages:流程分几步?
stages 是 Pipeline 的「骨架」,里面包含一个或多个 stage。每个 stage 代表一个阶段,比如「编译」、「测试」、「部署」。
我个人习惯把 stage 命名得清晰一点,别写什么 stage('step1'),别人看了根本不知道你在干嘛。要写就写 stage('代码编译')、stage('单元测试'),一目了然。
steps:每一步干啥?
steps 是 stage 里的具体操作。可以是一条 shell 命令,也可以是 Jenkins 插件提供的步骤,比如 git、sh、echo 等。
小技巧:steps 里尽量保持每个步骤职责单一。一个 steps 里写 50 行 shell 脚本?那还不如拆成多个 stage。你想想看,如果中间某一步失败了,日志定位多方便。
第一个 Pipeline 脚本
光说不练假把式。咱们直接上手写一个最简单的声明式 Pipeline。这个脚本会完成:拉代码 → 编译 → 跑测试 → 打包。
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
echo '正在从 Git 拉取代码...'
git 'https://github.com/your-repo/demo.git'
}
}
stage('编译') {
steps {
echo '开始编译项目...'
sh 'mvn clean compile'
}
}
stage('单元测试') {
steps {
echo '运行单元测试...'
sh 'mvn test'
}
}
stage('打包') {
steps {
echo '打包成 JAR 文件...'
sh 'mvn package -DskipTests'
}
}
}
post {
success {
echo '🎉 流水线执行成功!'
}
failure {
echo '❌ 流水线执行失败,请检查日志。'
}
}
}
这个脚本你直接复制到 Jenkins 的 Pipeline 任务里就能跑。注意几点:
post块不是必须的,但加上后能让你第一时间知道结果。我习惯在每个 Pipeline 里都加上 success 和 failure 的回调。git步骤需要 Jenkins 上配置好 Git 凭证,否则会认证失败。sh步骤默认在 Linux 节点上执行,如果你用 Windows,记得换成bat。
注意:第一次跑 Pipeline 时,Jenkins 会提示「Pipeline 脚本没有经过审批」。这是因为 Jenkins 默认开启了「Groovy 沙箱」安全机制。你需要在 Jenkins 管理后台 → In-process Script Approval 里批准一下,或者把脚本放到 Jenkinsfile 里从仓库加载。
说到 Jenkinsfile,我建议你从一开始就把 Pipeline 脚本放到代码仓库里,命名为 Jenkinsfile。这样做的好处是:
- 脚本跟代码一起版本管理,改了什么一目了然
- 不同分支可以用不同的 Jenkinsfile
- 新成员拉下代码就能看到 CI/CD 流程,不用再问「构建怎么配的」
好了,这一章的内容就到这。你先把上面这个脚本跑通,感受一下声明式 Pipeline 的「骨架感」。下一章咱们会深入讲讲 environment、parameters、when 这些实用指令,让你的 Pipeline 真正「活」起来。