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 '出错了,快去检查!'
        }
    }
}

这段代码做了什么事?

  1. 告诉Jenkins:用任意可用的节点来跑
  2. 定义了两个阶段:先打招呼,再说再见
  3. 每个阶段只做一件事:打印一句话
  4. 不管成功还是失败,最后都会打印「流水线执行完毕」

我曾经犯过一个低级错误:把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可以这么强大。