2754392de781ebe297c0c536b46de600
Jenkins Pipeline 详解

一、前言

上一篇我们通过一个实例实践了持续集成,相信大家对持续集成都有一个宏观的了解。本篇文章主要讲解最核心的 Jenkins Pipeline 部分。

二、Jenkins Pipeline

Jenkins Pipeline 就是一系列的插件集合,可通过组合它们来实现持续集成和交付的功能。 Pipeline DSL 为我们提供了一个可扩展的工具集,将简单到复杂的逻辑通过代码实现。

通常,我们可以通过编写Jenkinsfile将管道代码化,并且纳入到版本管理系统中。以上一篇的实例为例:

pipeline {
  agent any ①
  stages {
    stage('test') { ②
      steps { ③
        sh '''export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
fastlane test''' ④
      }
    }
    stage('build') {
      steps {
        sh '''export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
fastlane build'''
      }
    }
    stage('deploy') {
      steps {
        sh '''export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
fastlane deploy'''
      }
    }
    stage('notify') {
      steps {
        echo 'notify'
        sh '''gitmessage=$(git log --format=%B -n 1)
python fastlane/dingding.py -r https://oapi.dingtalk.com/robot/send?access_token=febcd5e36d19097f93c9afbe5b72d6015381d8682cb0be24ed00deeb239315bd -m "${gitmessage}"'''
      }
    }
  }
  post {
    failure {
      node('master') {
        echo 'failure'
        sh '''gitmessage=$(git log --format=%B -n 1)
python fastlane/dingding.py -t fail -r https://oapi.dingtalk.com/robot/send?access_token=febcd5e36d19097f93c9afbe5b72d6015381d8682cb0be24ed00deeb239315bd -m ${gitmessage}'''
      }
    }
  }
}

  • ① agent 指示 Jenkins 分配一个节点来执行下面的 Pipeline。
    节点就是指执行的机器,实例中就表示当前跑 Jenkins 的机器。因为目前我们只有一个节点,所以这边写 any,表示任意。
  • ② stage 表示这个Pipeline的一个执行阶段。
  • ③ steps 表示在这个stage中每一个步骤
  • ④ sh 执行指定的命令

三、高级特性

通过 Jenkins Pipeline 的基础特性已经能完成经典的 test、build、deploy、notify 集成流水线。下面介绍一些高级特性以满足不同业务的需求:

  • 环境变量
  • 参数
  • 多分支集成
  • 结束操作
  • 条件集成

1、环境变量

环境变量的作用和代码中的变量一样,能在各自的领域内定义和使用。

pipeline {
  agent any
  environment { 
    AA = 'Hello'
  }
  stages {
    stage('test') {
      environment { 
        BB = 'World'
      }
      steps {
        echo "${env.AA} ${env.BB}"
        echo "Running on ${env.JENKINS_URL}"
      }
    }
  }
}

环境变量也有“局部”“全局” 之分。上例中,AA 变量定义在 pipeline 下,所以可以在整个 pipeline 范围使用;BB 变量定义在 stage('test') 下,所以只能在该 stage 范围内使用。

除此之外,Jenkins定了很多内置的环境变量,可在文档 http://localhost:8080/pipeline-syntax/globals#env 中找到。

使用环境变量时,只需使用 ${ env. } 包裹即可。

2、参数

parameters 指令提供了一个用户在触发流水线时应该提供的参数列表。这些用户指定参数的值可通过 params 对象提供给流水线步骤。

pipeline {
    agent any
    parameters {
        string(name: 'PERSON', defaultValue: 'Catch Zeng', description: 'Who should I say hello to?')
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"
            }
        }
    }
}

可用参数

字符串类型的参数, 例如:

parameters { string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '') }

布尔参数, 例如:

top Created with Sketch.