4、Jenkins Pipeline基础:Pipeline概念(Declarative vs Scripted),Jenkinsfile基础语法,简单的Hello World Pipeline
4.1 什么是Pipeline?我为什么要用它?
Pipeline,说白了就是一套自动化流程。
你想想看,以前我们做持续集成,是不是得手动点构建、手动跑测试、手动部署?累不累?而且容易出错。Pipeline就是把这些步骤写成代码,让Jenkins自动去执行。
我个人习惯把Pipeline理解成「流水线的剧本」。你写好了剧本,Jenkins这个演员就照着演,一步都不会错。
我在项目中遇到过最典型的情况:新同事来了,不知道构建流程怎么走。有了Pipeline,看一眼Jenkinsfile就全明白了。这就是代码即配置的好处。
4.2 Declarative vs Scripted:两种风格怎么选?
Jenkins Pipeline有两种写法:Declarative(声明式)和Scripted(脚本式)。
嗯,这里要注意,它们不是谁替代谁的关系,而是适用场景不同。
| 对比项 | Declarative(声明式) | Scripted(脚本式) |
|---|---|---|
| 语法风格 | 结构化、严格 | 灵活、自由 |
| 学习曲线 | 低,适合新手 | 高,需要Groovy基础 |
| 代码量 | 少,简洁 | 相对多 |
| 错误检查 | 编译时检查 | 运行时检查 |
| 适用场景 | 标准CI/CD流程 | 复杂逻辑、动态流程 |
我建议初学者从Declarative开始。为什么?因为它的结构清晰,你一眼就能看出pipeline、stages、steps这些层级关系。我曾经带过一个团队,全部用Declarative,三个月下来没人写错过语法。
Scripted更像是一段Groovy脚本,你可以写if-else、循环、甚至定义函数。但说实话,除非你的流程特别复杂,否则Declarative完全够用。
核心建议:80%的场景用Declarative,20%的复杂场景用Scripted。别为了炫技而用Scripted。
4.3 Jenkinsfile基础语法:你得知道的几个关键词
Jenkinsfile就是Pipeline的代码文件。它通常放在项目根目录下,跟代码一起版本管理。
来看几个最核心的关键词:
- pipeline:整个流水线的根节点,所有内容都包在里面
- agent:指定在哪个节点上运行。any表示任意可用节点
- stages:包含多个stage,代表流水线的各个阶段
- stage:一个具体的阶段,比如「编译」、「测试」、「部署」
- steps:每个stage里的具体操作步骤
- post:流水线执行后的处理,比如发通知、清理工作区
为什么会这样设计?其实很简单。你想想看,一个完整的CI流程不就是:准备环境 → 做事情 → 收尾。pipeline就是外壳,stages是中间的过程,post是收尾。
小技巧:我习惯在Jenkinsfile开头加一行#!groovy,这样编辑器能正确识别语法高亮。
4.4 Hello World Pipeline:动手写第一个
光说不练假把式。我们来写一个最简单的Hello World Pipeline。
这个例子虽然简单,但包含了Pipeline的所有核心结构。你学会了它,后面再复杂的Pipeline都是在这个基础上加东西。
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello, World!'
}
}
stage('Bye') {
steps {
echo 'Goodbye, World!'
}
}
}
post {
always {
echo '流水线执行完毕'
}
success {
echo '恭喜,全部通过!'
}
failure {
echo '出错了,快去检查!'
}
}
}
这段代码做了什么事?
- 告诉Jenkins:用任意可用的节点来跑
- 定义了两个阶段:先打招呼,再说再见
- 每个阶段只做一件事:打印一句话
- 不管成功还是失败,最后都会打印「流水线执行完毕」
我曾经犯过一个低级错误:把echo写成了print。在Jenkins Pipeline里,echo才是正确写法。嗯,这种小坑踩过一次就记住了。
注意:Jenkinsfile对缩进敏感。建议统一用2个空格缩进,不要用Tab。我曾经因为Tab和空格混用,排查了半天才发现是缩进问题。
4.5 怎么运行这个Pipeline?
有两种方式:
- 方式一:在Jenkins界面新建一个Pipeline任务,在配置里直接粘贴上面的代码
- 方式二:把代码保存为
Jenkinsfile,放到Git仓库根目录,然后在Jenkins任务里配置「Pipeline from SCM」
我个人强烈推荐方式二。为什么?因为Jenkinsfile跟代码一起版本管理,改了什么一目了然。你想想看,如果Pipeline写在Jenkins界面里,哪天Jenkins挂了,你的配置就全丢了。
4.6 避坑指南
最后分享几个我踩过的坑:
- agent写错位置:agent必须放在pipeline块的第一层,不能放在stage里(除非是声明式Pipeline的agent per stage)
- 少写steps:每个stage里必须有一个steps块,哪怕里面只有一个echo
- post块放错位置:post必须放在stages外面,跟stages平级
我曾经有一次把post写在了stages里面,结果Jenkins直接报语法错误。查了半小时文档才发现。所以,结构一定要记清楚。
好了,这就是Pipeline的基础。下一章我们会深入Declarative Pipeline的更多细节,包括环境变量、参数化构建、并行执行等等。到时候你会发现,原来Pipeline可以这么强大。