跳转至

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 的方式直接在流水线中使用,其他的凭证使用方式参考使用凭证

使用方式请参考:

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 指令用于连续交付过程的每个离散部分,比如构建,测试,,和部署。

pipeline {
    agent any
    stages { 
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

steps

steps 部分在给定的 stage 指令中执行的定义了一系列的一个或多个 steps。

pipeline {
    agent any
    stages {
        stage('Example') {
            steps { // steps 部分必须包含一个或多个步骤。
                echo 'Hello World'
            }
        }
    }
}

以上仅描述了部分声明式 Pipeline,详细可参考 Jenkins 官方的语法介绍

评论