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 的骨架就三个关键词:agentstagessteps。你只要搞懂这三个,就能写出 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 插件提供的步骤,比如 gitshecho 等。

小技巧: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。这样做的好处是:

  1. 脚本跟代码一起版本管理,改了什么一目了然
  2. 不同分支可以用不同的 Jenkinsfile
  3. 新成员拉下代码就能看到 CI/CD 流程,不用再问「构建怎么配的」

好了,这一章的内容就到这。你先把上面这个脚本跑通,感受一下声明式 Pipeline 的「骨架感」。下一章咱们会深入讲讲 environmentparameterswhen 这些实用指令,让你的 Pipeline 真正「活」起来。