environment与options
流水线变量
在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