指令1:environment

该environment指令指定一系列键值对,这些对值将被定义为所有步骤的环境变量或阶段特定步骤,具体取决于environment指令位于Pipeline中的位置。

解释一下什么意思,environment{…}, 大括号里面写一些键值对,也就是定义一些变量并赋值,这些变量就是环境变量。环境变量的作用范围,取决你environment{…}所写的位置,你可以写在顶层环境变量,让所有的stage下的step共享这些变量,也可以单独定义在某一个stage下,只能供这个stage去调用变量,其他的stage不能共享这些变量。一般来说,我们基本上上定义全局环境变量,如果是局部环境变量,我们直接用def关键字声明就可以,没必要放environment{…}里面。

代码举例:

Pipeline {
    agent any
    environment {
        unit_test = true
    }
    stages {
        stage('Example') {
            steps {
                if(unit_test == true) {
                   // call run unit test methods
                }
            }
        }
    }
}

指令2:options

options指令允许在Pipeline本身内配置Pipeline专用选项。Pipeline本身提供了许多选项,例如buildDiscarder,但它们也可能由插件提供,例如 timestamps。

可用选项

buildDiscarder

pipeline保持构建的最大个数。例如:options {buildDiscarder(logRotator(numToKeepStr: ‘1’)) }

disableConcurrentBuilds

不允许并行执行Pipeline,可用于防止同时访问共享资源等。例如:options { disableConcurrentBuilds() }

skipDefaultCheckout

默认跳过来自源代码控制的代码。例如:options { skipDefaultCheckout() }

skipStagesAfterUnstable

一旦构建状态进入了“Unstable”状态,就跳过此stage。例如:options { skipStagesAfterUnstable() }

timeout

设置Pipeline运行的超时时间。例如:options { timeout(time: 1, unit: ‘HOURS’) }

retry

失败后,重试整个Pipeline的次数。例如:options { retry(3) }

timestamps

在控制台打印所有操作的时间戳。例如:options { timestamps() }

如果要用,一个pipeline{…}内只运行出现一次options{…}, 下面看一个下这个retry的使用。

代码举例:

Pipeline {
    agent any
    options {
        retry(3)
		timeout(time:1,unit: 'HOURS')
    }
    stages {
        stage('Example') {
            steps {
                // call some method
            }
        }
    }
}

上面的整个pipeline{…}, 如果在jenkins上job执行失败,会继续执行,如果再遇到失败,继续执行一次,总共执行三次。这种任务场景,一般是在夜间执行,无人值守的时候。例如,如果要下班前,要提交一个jenkinsjob,跑一下测试,由于之前经验告诉我,跑这些测试很不稳定,我就可以通过上面代码,让pipeline代码失败的时候还可以再尝试运行两次,第二天来看结果。timeout(time:1,unit: ‘HOURS’)是配置pipeline超时时间。

上面是把options{…}放在顶层里,也可以放在具体的某一个stage下,意味这这个stage下所有代码,如果遇到失败,最多执行三次。

指令3:parameters

改parameters是参数的意思,parameters指令提供用户在触发Pipeline时应提供的参数列表。这些用户指定的参数的值通过该params对象可用于Pipeline步骤。

我们很多人听过参数化构建,也可能知道如何在一个jenkins job上,通过UI创建不同的参数,例如有字符串参数,布尔选择参数,下拉多选参数等。这些参数即可以通过UI点击创建,也可以通过pipeline代码去写出来。我们先来看看了解有那些具体参数类型,然后挑选几个,分别用UI和代码方式去实现创建这些参数。

除了常用的字符串参数,密码参数,选择参数还有文件参数

文件(file)参数就是在Jenkins 参数化构建UI上提供一个文件路径的输入框,Jenkins会自动去你提供的网络路径去查找并下载。一般伴随着还有你需要在Pipleline代码中写解析文件。也有这样场景,这个构建job就是把一个war包部署到服务器上特定位置,你可以使用这个文件参数。
代码举例:

Pipeline {
    agent any
    parameters {
        name: 'FILE', description: 'Some file to upload')
    }
}

指令post

post
  定义Pipeline或stage运行结束时的操作。post-condition块支持post部件:always,changed,failure,success,unstable,和aborted。这些块允许在Pipeline或stage运行结束时执行步骤,具体取决于Pipeline的状态。

conditions项:
always
    运行,无论Pipeline运行的完成状态如何。
  changed
    只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行。
  failure
    仅当当前Pipeline处于“失败”状态时才运行,通常在Web UI中用红色指示表示。
  success
    仅当当前Pipeline具有“成功”状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。
  unstable
    只有当前Pipeline具有“不稳定”状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。
  aborted
    只有当前Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post {
        always {
            echo 'I will always say Hello again!'
        }
    }
}

when

when指令允许Pipeline根据给定的条件确定是否执行该阶段。该when指令必须至少包含一个条件。如果when指令包含多个条件,则所有子条件必须为stage执行返回true。这与子条件嵌套在一个allOf条件中相同(见下面的例子)。
更复杂的条件结构可使用嵌套条件建:not,allOf或anyOf。嵌套条件可以嵌套到任意深度。

内置条件
  branch
    当正在构建的分支与给出的分支模式匹配时执行,例如:when { branch ‘master’ }。请注意,这仅适用于多分支Pipeline。
  environment
    当指定的环境变量设置为给定值时执行,例如: when { environment name: ‘DEPLOY_TO’, value: ‘production’ }
  expression
    当指定的Groovy表达式求值为true时执行,例如: when { expression { return params.DEBUG_BUILD } }
  not
    当嵌套条件为false时执行。必须包含一个条件。例如:when { not { branch ‘master’ } }
  allOf
    当所有嵌套条件都为真时执行。必须至少包含一个条件。例如:when { allOf { branch ‘master’; environment name: ‘DEPLOY_TO’, value: ‘production’ } }
  anyOf
    当至少一个嵌套条件为真时执行。必须至少包含一个条件。例如:

when { anyOf { branch 'master'; branch 'staging' } }
pipeline {
    agent any
    stages {
        stage('Example Build') {
            steps {
                echo 'Hello World'
            }
        }
        stage('Example Deploy') {
            when {
                allOf {
                    branch 'production'
                    environment name: 'DEPLOY_TO', value: 'production'
                }
            }
            steps {
                echo 'Deploying'
            }
        }
    }
}

Parallel(并行)

Declarative Pipeline近期新增了对并行嵌套stage的支持,对耗时长,相互不存在依赖的stage可以使用此方式提升运行效率。除了parallel stage,单个parallel里的多个step也可以使用并行的方式运行。

pipeline {
    agent any
    stages {
        stage('Non-Parallel Stage') {
            steps {
                echo 'This stage will be executed first.'
            }
        }
        stage('Parallel Stage') {
            when {
                branch 'master'
            }
            parallel {
                stage('Branch A') {
                    agent {
                        label "for-branch-a"
                    }
                    steps {
                        echo "On Branch A"
                    }
                }
                stage('Branch B') {
                    agent {
                        label "for-branch-b"
                    }
                    steps {
                        echo "On Branch B"
                    }
                }
            }
        }
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐