18.3.1 Pipeline语法基础与Jenkinsfile结构

Pipeline概念与运行机制#

Pipeline是Jenkins的流水线编排模型,通过代码定义从构建、测试到发布的完整流程。流水线在Jenkins中以Stage为可视化单元,执行由Agent承载,步骤由Step组成,支持持续集成与交付的可重复执行。

原理草图(从Jenkinsfile到执行器):

文章图片

Jenkinsfile位置与生命周期#

Jenkinsfile通常放在代码仓库根目录,作为流水线即代码的核心文件,随代码版本化管理。典型生命周期包括:拉取代码 → 解析Jenkinsfile → 分配Agent → 依次执行Stages → 归档与通知。

仓库结构示例:

repo/
├── Jenkinsfile
├── src/
└── README.md

生命周期关键日志定位命令(控制台输出中检索阶段):

# 在构建控制台中查找关键阶段
grep -n "Stage" /var/lib/jenkins/jobs/demo/builds/1/log

Jenkinsfile基础结构#

Declarative Pipeline的基本骨架如下:
- pipeline:根块,定义流水线
- agent:执行节点,支持any/label/docker/kubernetes
- stages:阶段集合
- stage:单个阶段
- steps:阶段内执行步骤

完整可执行示例(根目录 Jenkinsfile):

pipeline {
  agent any
  options {
    timeout(time: 20, unit: 'MINUTES')
    buildDiscarder(logRotator(numToKeepStr: '20'))
  }
  environment {
    APP_NAME = "demo-app"
  }
  stages {
    stage('Checkout') {
      steps {
        checkout scm
      }
    }
    stage('Build') {
      steps {
        sh 'echo "Building ${APP_NAME}"'
      }
    }
    stage('Test') {
      steps {
        sh 'echo "Running tests"'
      }
    }
  }
  post {
    success {
      archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
    }
    failure {
      mail to: 'devops@example.com', subject: 'Build Failed', body: 'Check Jenkins console output.'
    }
    always {
      cleanWs()
    }
  }
}

核心语法要点#

  • agent:指定运行环境与节点策略
  • stages:定义流水线阶段与执行顺序
  • steps:执行shell、bat、script等
  • post:定义成功/失败/始终执行的后置动作
  • options:构建超时、日志保留、并发控制
  • environment:全局或阶段级环境变量
  • parameters:构建参数化入口
  • tools:配置JDK/Maven等工具链

语法片段示例(参数+工具链):

parameters {
  string(name: 'BRANCH', defaultValue: 'main', description: 'Git branch')
  booleanParam(name: 'RUN_TEST', defaultValue: true, description: 'Run tests')
}
tools {
  jdk 'jdk11'
  maven 'maven3'
}

常用Step示例#

  • sh/bat:执行命令行
  • checkout/scm:检出代码
  • archiveArtifacts:归档制品
  • stash/unstash:跨节点传递文件
  • junit:测试报告收集
  • input:人工审批

示例:跨节点传递构建产物

stage('Build') {
  steps {
    sh 'mkdir -p dist && echo "binary" > dist/app.bin'
    stash name: 'app-bin', includes: 'dist/app.bin'
  }
}
stage('Deploy') {
  agent { label 'deploy-node' }
  steps {
    unstash 'app-bin'
    sh 'ls -l dist/'
  }
}

Jenkinsfile编写规范与最佳实践#

  • 固定结构:pipeline → agent → options → environment → stages → post
  • 阶段命名清晰,体现业务语义
  • 关键步骤添加超时与重试控制
  • 仅保留最小可用权限与凭据
  • 使用流水线共享库抽象重复逻辑
  • 与制品、镜像、版本号保持一致性

规范示例:超时与重试

stage('Build') {
  options { timeout(time: 10, unit: 'MINUTES') }
  steps {
    retry(2) {
      sh 'make build'
    }
  }
}

安装与前置配置(与本节相关)#

确保已安装Pipeline相关插件与Jenkins CLI(示例为LTS):

# 1) 下载 jenkins-cli
curl -o jenkins-cli.jar http://jenkins.example.com/jnlpJars/jenkins-cli.jar

# 2) 安装必要插件(Pipeline)
java -jar jenkins-cli.jar -s http://jenkins.example.com/ \
  -auth admin:admin \
  install-plugin workflow-aggregator pipeline-stage-view git

# 3) 重启使插件生效
java -jar jenkins-cli.jar -s http://jenkins.example.com/ \
  -auth admin:admin safe-restart

创建流水线任务后选择“Pipeline script from SCM”,并填写仓库地址与凭据。

常见错误与排查方向#

  • 语法错误:检查括号、缩进与指令位置
  • Agent不可用:确认节点标签与执行器资源
  • Step缺失:确认插件安装与版本
  • SCM拉取失败:检查凭据与网络
  • 步骤超时:合理配置超时与分阶段拆分

排错命令示例:

# 检查节点在线状态(在节点机器)
systemctl status jenkins-agent

# 检查插件是否安装
java -jar jenkins-cli.jar -s http://jenkins.example.com/ \
  -auth admin:admin list-plugins | grep workflow

# SCM失败时测试网络连通性
git ls-remote https://github.com/example/repo.git

练习#

  1. 在新仓库中创建Jenkinsfile,包含Checkout/Build/Test三个Stage,并使用post归档产物。
  2. 增加参数BRANCH,实现可选择分支构建。
  3. 使用stash/unstash在两个不同label的Agent间传递构建文件。
  4. 故意写错一个指令(如stage写成stages),观察控制台错误并修复。

预期效果:
- 控制台输出显示各Stage顺序执行
- 构建完成后“Artifacts”可下载产物
- 失败时触发post中的failure分支