流水线变量
在pipeline中也是可以定义变量,使用变量的。使用关键字environment
1. 全局变量/局部变量
1.1 全局变量
流水线中也是有局部变量和全局变量之分的,他们都是使用关键字environment来定义
pipeline { agent { kubernetes { cloud 'kubernetes' showRawYaml true yaml """ """ } } environment { key = 'key01' } stages { stage('Hello') { steps { echo "${ key }" } } } }
这里我们在stages外面定义了一个environment,里面有变量名key,他的值是key01
然后我们在stages里面输出了这个量,引用变量的格式是"${变量名}"
然后构建这个流水线
Running on hello-kuber-5-svx2v-pnhsc-dz2k7 in /home/jenkins/agent/workspace/hello-kuber [Pipeline] { [Pipeline] withEnv [Pipeline] { [Pipeline] stage [Pipeline] { (Hello) [Pipeline] echo key01 [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] } [Pipeline] // podTemplate [Pipeline] End of Pipeline Finished: SUCCESS
看最后的输出,他就将变量的值key01给输出了
2. 局部变量
除了全局变量,还可以定义局部变量
pipeline { agent { kubernetes { cloud 'kubernetes' showRawYaml true yaml """ """ } } environment { key = 'key01' } stages { stage('Hello') { environment { key = 'key02' } steps { echo "${ key }" } } } }
现在有全局变量key=key01,和一个局部变量key=key02,输出一下这个变量
[Pipeline] echo key02 [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // node [Pipeline] } [Pipeline] // podTemplate [Pipeline] End of Pipeline Finished: SUCCESS
点击立即构建之后他输出的是key02,全局变量和局部变量冲突之后会采用局部变量,因为局部变量的优先级更高。当然局部变量只存在于这个stages中。
3. credentials插件
我们在流水线中需要使用某个凭证的时候,jenkins也是给我们提供了一个获取凭证的方式,就是使用credentials插件
pipeline { agent { kubernetes { cloud 'kubernetes' showRawYaml true yaml """ """ } } environment { key = 'key01' gitlab_user = credentials('test') } stages { stage('Hello') { environment { key = 'key02' } steps { echo "${ key }" echo "${gitlab_user_USR}" echo "${gitlab_user_PSW}" } } } }
在变量里面我们多加了一行内容gitlab_user = credentials('test'),他这个是调用credentials插件来获取id为test这个凭证的内容然后复制给变量gitlab_user,然后我们在stages里面去输出这个凭证的用户名和密码
注意我们输出的方式,我们的变量名是gitlab_user,如果我们获取的凭据他是用户名和密码这种凭据的话,那么这个变量只是一个前缀,需要获取具体的用户名就是gitlab_user.USR
密码就是gitlab_user.PAS,我们来构建一下,看一下输出
[Pipeline] echo test [Pipeline] echo Warning: A secret was passed to "echo" using Groovy String interpolation, which is insecure. Affected argument(s) used the following variable(s): [gitlab_user_PSW] See https://jenkins.io/redirect/groovy-string-interpolation for details. **** [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // withCredentials [Pipeline] } [Pipeline] // node [Pipeline] } [Pipeline] // podTemplate [Pipeline] End of Pipeline Finished: SUCCESS
可以看到用户名test已经被输出了,但是在输出密码的时候还是输出的****,这是因为他的保护机制,如果你是正常使用这个密码去连接的话是没有问题的
options
options用于定义pipeline运行时的约束,如是否在执行pipeline时打印时间戳,如果pipeline执行超过2小时,则强行终止并判定失败;禁止并行(这里的并行并不是指pipeline语法中的parallel,而是说一个任务不能有两个job同时运行)等等。
options的示例:
options { timestamps() //日志会有时间 skipDefaultCheckout() //删除隐式checkout scm语句 disableConcurrentBuilds() //禁止并行 timeout(time: 2, unit: 'HOURS') }
常用options说明如下:
- buildDiscarder:为最近的流水线运行的特定数量保存组件和控制台输出
- disableConcurrentBuilds:关闭并行执行构建,可被用来防止同时访问共享资源等
- overrideIndexTriggers:允许覆盖分支索引触发器的默认处理
- skipDefaultCheckout:在pipeline中,如果配置有代码仓库,则agent会默认检出代码,此选项用于跳过这个默认动作
- skipStagesAfterUnstable:一旦构建状态变得unstable,则跳过该阶段
- checkoutToSubdirectory:在工作空间的子目录中自动的执行源码检出
- timeout:设置流水线运行的超时时间
timeout(time: 30, unit: 'MINUTES')
- retry:在失败时,指定重试次数
- timestamps:在流水线输出时,打印时间
1. 定义options
如果在options里面加入了timestamps(),那么需要安装一个插件叫做 timestamper
如果没有按装直接定义这个options的话构建是会报错的
pipeline { agent { kubernetes { cloud 'kubernetes' showRawYaml true yaml """ """ } } options { timestamps() skipDefaultCheckout() disableConcurrentBuilds() timeout(time: 2, unit: 'HOURS') } environment { key = 'key01' gitlab_user = credentials('test') } stages { stage('Hello') { environment { key = 'key02' } steps { echo "${ key }" echo "${gitlab_user_USR}" } } } }
然后我们在输出里面就可以看到有时间了
16:29:08 key02 [Pipeline] echo 16:29:08 test [Pipeline] echo [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // stage [Pipeline] } [Pipeline] // timeout [Pipeline] } [Pipeline] // timestamps [Pipeline] } [Pipeline] // withEnv [Pipeline] } [Pipeline] // withCredentials [Pipeline] } [Pipeline] // node [Pipeline] } [Pipeline] // podTemplate [Pipeline] End of Pipeline Finished: SUCCESS
本文来自博客园,作者:FuShudi,转载请注明原文链接:https://www.cnblogs.com/fsdstudy/p/18263594