本篇继续介绍Pipeline的基础语法,这篇先看看指令。然后看看常见的几种参数的手工创建和自动化代码创建过程。
指令1:environment
该environment指令指定一系列键值对,这些对值将被定义为所有步骤的环境变量或阶段特定步骤,具体取决于environment指令位于Pipeline中的位置。
解释一下什么意思,environment{…}, 大括号里面写一些键值对,也就是定义一些变量并赋值,这些变量就是环境变量。环境变量的作用范围,取决你environment{…}所写的位置,你可以写在顶层环境变量,让所有的stage下的step共享这些变量,也可以单独定义在某一个stage下,只能供这个stage去调用变量,其他的stage不能共享这些变量。一般来说,我们基本上上定义全局环境变量,如果是局部环境变量,我们直接用def关键字声明就可以,没必要放environment{…}里面。
代码举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 1Pipeline {
2 agent any
3 environment {
4 unit_test = true
5 }
6 stages {
7 stage('Example') {
8 steps {
9 if(unit_test == true) {
10 // call run unit test methods
11 }
12 }
13 }
14 }
15}
16
指令2:options
该options指令允许在Pipeline本身内配置Pipeline专用选项。Pipeline提供了许多这些选项,例如buildDiscarder,但它们也可能由插件提供,例如 timestamps。
这个options{…}不是一个必须的指令,我几乎没有用到过这个,如果要用,一个pipeline{…}内只运行出现一次options{…}, 下面看一个下这个retry的使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14 1Pipeline {
2 agent any
3 options {
4 retry(3)
5 }
6 stages {
7 stage('Example') {
8 steps {
9 // call some method
10 }
11 }
12 }
13}
14
上面的整个pipeline{…}, 如果在jenkins上job执行失败,会继续执行,如果再遇到失败,继续执行一次,总共执行三次。这种任务场景,一般是在夜间执行,无人值守的时候。例如,如果要下班前,要提交一个jenkins job,跑一下测试,由于之前经验告诉我,跑这些测试很不稳定,我就可以通过上面代码,让pipeline代码失败的时候还可以再尝试运行两次,第二天来看结果。总体来说,这个指令不是必须要有的,所以不是必须要掌握学习好的。
上面是把options{…}放在顶层里,也可以放在具体的某一个stage下,意味这这个stage下所有代码,如果遇到失败,最多执行三次。
指令3:parameters
改parameters是参数的意思,parameters指令提供用户在触发Pipeline时应提供的参数列表。这些用户指定的参数的值通过该params对象可用于Pipeline步骤。
我们很多人听过参数化构建,也可能知道如何在一个jenkins job上,通过UI创建不同的参数,例如有字符串参数,布尔选择参数,下拉多选参数等。这些参数即可以通过UI点击创建,也可以通过pipeline代码去写出来。我们先来看看了解有那些具体参数类型,然后挑选几个,分别用UI和代码方式去实现创建这些参数。
字符串参数
就是定义一个字符串参数,用户可以在Jenkins UI上输入字符串,常见使用这个参数的场景有,用户名,收件人邮箱,文件网络路径,主机名称的或者url等
代码举例:
1
2
3
4
5
6
7 1Pipeline {
2 agent any
3 parameters {
4 string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: '')
5 }
6}
7
布尔值参数
就是定义一个布尔类型参数,用户可以在Jenkins UI上选择是还是否,选择是表示代码会执行这部分,如果选择否,会跳过这部分。一般需要使用布尔值的场景有,执行一些特定集成的脚本或则工作,或者事后清除环境,例如清楚Jenkins的workspace这样的动作。
代码举例:
1
2
3
4
5
6
7 1Pipeline {
2 agent any
3 parameters {
4 booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '')
5 }
6}
7
文本参数
文本(text)的参数就是支持写很多行的字符串,这个变量我好像没有使用过,例如想给发送一段欢迎的消息,你可以采用text的参数。
代码举例:
1
2
3
4
5
6
7
8 1Pipeline {
2 agent any
3 parameters {
4 text(name: 'Welcome_text', defaultValue: 'One\nTwo\nThree\n', description: '')
5 }
6
7}
8
上面的\n表示换行,上面写了三行的text。
选择参数
选择(choice)的参数就是支持用户从多个选择项中,选择一个值用来表示这个变量的值。工作中常用的场景,有选择服务器类型,选择版本号等。
代码举例:
1
2
3
4
5
6
7
8 1Pipeline {
2 agent any
3 parameters {
4 choice(name: 'ENV_TYPE', choices: ['test', 'dev', 'product'], description: 'test means test env,….')
5
6 }
7}
8
文件参数
文件(file)参数就是在Jenkins 参数化构建UI上提供一个文件路径的输入框,Jenkins会自动去你提供的网络路径去查找并下载。一般伴随着还有你需要在Pipleline代码中写解析文件。也有这样场景,这个构建job就是把一个war包部署到服务器上特定位置,你可以使用这个文件参数。
代码举例:
1
2
3
4
5
6
7
8 1Pipeline {
2 agent any
3 parameters {
4 name: 'FILE', description: 'Some file to upload')
5 }
6
7}
8
密码参数
密码(password)参数就是在Jenkins 参数化构建UI提供一个暗文密码输入框,例如,我需要在一些linux机器上做自动化操作,需要提供机器的用户名和密码,由于密码涉及安全问题,一般都采用暗文显示,这个时候你就不能用string类型参数,就需要使用password参数类型。
代码举例:
1
2
3
4
5
6
7
8 1Pipeline {
2 agent any
3 parameters {
4 password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'A secret password')
5
6 }
7}
8
下面我选择字符串,选择和布尔三个类型,分别用UI创建和代码创建的方式去实现Jenkins Job的参数化构建。
方式1,Jenkins UI手动创建
1 新建一个pipeline job,参考下面这图,注意勾选下面这项。
2.选择字符串参数,填入相关信息
3.重复步骤2,分别创建choice和booleam类型参数
点击保存和Apply按钮,然后打开左侧一个参数化构建的菜单:Build with Parameters
代码方式实现参数创建和赋值过程。
上面的字符串和布尔已经选择参数化都可以在pipeline代码中实现,并不需要手动去在Jenkins UI上一个一个创建。
先把上面job-配置界面,去掉参数化,点击保存。如果不会,你干脆新建一个pipeline job类型。点击这个job配置页面中的pipeline tab,选择从git项目上执行一个jenkinsfile文件。前提你把上面代码保存到你github的一个项目里。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1pipeline{
2
3 agent any
4 parameters {
5 string(name: 'userName', defaultValue: 'Anthony', description: 'please give a name')
6 choice(name: 'version', choices: ['1.1', '1.2', '1.3'], description: 'select the version to test')
7 booleanParam(name: 'is_boy', defaultValue: true, description: 'you is boy or not')
8 }
9 stages {
10 stage('test') {
11 steps{
12 script {
13 sh "java -version"
14 }
15 }
16 }
17 }
18}
19
点击保存,然后再去左侧,参数化构建菜单,点击看看效果。
保存之后,你会发现,菜单是Build now,而并不是Build with Parameters,这个是正常,你先点击Build now,先完成第一个构建,Jenkins第二个构建才会显示代码中的三个参数。刷新之后,就可以看到参数化构建这个菜单。