Jenkins Pipeline 语法¶
Jenkins 支持**声明式 Pipeline** 、脚本式 Pipeline,工作台主要采用**声明式 Pipeline 语法**,所以本文将重点介绍 Jenkins 声明式语法。
声明式 Pipeline 语法概述¶
Pipeline 脚本基于 Groovy 语言,但即便你不熟悉 Groovy,也可以通过简单的学习来编写基础的 Pipeline 脚本,以下是一个精简的声明式 Pipeline 示例:
pipeline {
    agent any // 定义在哪里运行Pipeline,`any`表示可以在任何可用的agent上运行
    parameters {
        // 设置构建参数
    }
     environment { 
        // 设置环境变量
    }
    stages { // 定义执行的阶段
        stage('Build') { // 构建阶段
            steps {
                // 定义在构建阶段要执行的步骤
            }
        }
        stage('Test') { // 测试阶段
            steps {
                // 定义在测试阶段要执行的步骤
            }
        }
        stage('Deploy') { // 部署阶段
            steps {
                // 定义在部署阶段要执行的步骤
            }
        }
    }
}
部分模块介绍¶
Agent¶
agent 部分指定了整个流水线或特定的部分,将会在Jenkins环境中执行的位置,这取于 agent 区域的位置。该部分必须在 pipeline 块的顶层被定义,但是 stage 级别的使用是可选的。
目前工作台界面上已经支持了:
- 
any 在任何可用的代理上执行流水线或阶段。例如 agent any
- 
none 当在 pipeline块的顶部没有全局代理, 该参数将会被分配到整个流水线的运行中并且每个stage部分都需要包含他自己的agent部分。比如agent none
- 
node agent { node { label 'labelName' } },有关应用工作台内置的 node 请参考文档使用内置 lable
- 
kubernetes Pod 模板在 kubernetes { } 块内定义。 例如,如果您想要一个内部包含 podman 容器的 Pod,您可以按如下方式定义。 注意:一定要定义 jnlp 容器,目的是与 Jenkins 服务进行通信。 agent { kubernetes { defaultContainer 'kaniko' yaml ''' apiVersion: v1 kind: Pod metadata: labels: jenkins-pipeline: pipeline-amamba-pod spec: containers: - name: podman image: release-ci.daocloud.io/amamba/jenkins-agent/builder-base:v0.2.1-podman resources: limits: cpu: 500m memory: 1024Mi requests: cpu: 100m memory: 100Mi securityContext: privileged: true command: - cat tty: true - name: jnlp image: release-ci.daocloud.io/amamba/jenkins-agent/inbound-agent:4.10-2 resources: limits: cpu: 100m memory: 256Mi requests: cpu: 100m memory: 128Mi ''' }
environment¶
environment 指令制定一个 键-值对序列,该序列将被定义为所有步骤的环境变量,或者是特定于阶段的步骤,
这取决于 environment 指令在流水线内的位置。
详细介绍参考 Jenkins 官方文档,简单示例如下:
pipeline {
    agent any
    environment { 
        CC = 'clang'
                //  顶层流水线块中使用的 environment 指令将适用于流水线中的所有步骤。
    }
    stages {
        stage('Example') {
            environment {  // 在一个 stage 中定义的 environment 指令只会将给定的环境变量应用于 stage 中的步骤。
                AN_ACCESS_KEY = credentials('my-prefined-secret-text') 
                                // environment 块有一个 助手方法 credentials() 定义,该方法可以在 Jenkins 环境中用于通过标识符访问预定义的凭证。                        
            }
            steps {
                sh 'printenv'
            }
        }
    }
}
在 environment 区域中使用凭证¶
对于 secret text、 username and password 和 secret file 类型的凭据,支持通过使用 environment 的方式直接在流水线中使用,其他的凭证使用方式参考使用凭证。
使用方式请参考:
- 通过 environment使用 Secret text 凭证
- 通过 environment使用 Usernames and passwords 凭证
- 通过 environment使用 Secret files 凭证
parameters¶
parameters 指令提供了一个用户在触发流水线时应该提供的参数列表。这些用户指定参数的值可通过 params 对象提供给流水线步骤。
详细介绍参考 Jenkins 官方文档,简单示例如下:
pipeline {
    agent any
    parameters { 
       // 支持的 parameters 类型
        string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
        text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
        booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
        choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
        password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
    }
    stages {
        stage('Example') {
            steps {
                echo "Hello ${params.PERSON}"
                echo "Biography: ${params.BIOGRAPHY}"
                echo "Toggle: ${params.TOGGLE}"
                echo "Choice: ${params.CHOICE}"
                echo "Password: ${params.PASSWORD}"
            }
        }
    }
}
stages¶
包含一系列一个或多个 stage 指令,stages 部分是流水线描述的大部分"work" 的位置。
建议 stages 至少包含一个 stage 指令用于连续交付过程的每个离散部分,比如构建,测试,,和部署。
steps¶
steps 部分在给定的 stage 指令中执行的定义了一系列的一个或多个 steps。
pipeline {
    agent any
    stages {
        stage('Example') {
            steps { // steps 部分必须包含一个或多个步骤。
                echo 'Hello World'
            }
        }
    }
}
以上仅描述了部分声明式 Pipeline,详细可参考 Jenkins 官方的语法介绍。