Jenkins定时触发构建的同时设定参数。可以根据不同的定时构建器设置不同参数或环境变量的值。可以设置多个参数。并结合when控制stage流程的执行。结合when和triggeredBy区分定时构建的stage和手动执行的stage。
目录
- [什么是Parameterized Scheduler?](#什么是Parameterized Scheduler?)
- 如何配置实现呢?
- [声明式pipeline 配置例子](#声明式pipeline 配置例子)
- 使用when/triggeredBy指令
-
- [内置的cron 触发器中cron表达式结合when/triggeredBy指令](#内置的cron 触发器中cron表达式结合when/triggeredBy指令)
- [parameterizedCron 触发器中cron表达式结合when/triggeredBy指令](#parameterizedCron 触发器中cron表达式结合when/triggeredBy指令)
- [parameterizedCron 触发器中cron表达式参数控制stage执行](#parameterizedCron 触发器中cron表达式参数控制stage执行)
- 脚本化管道示例
- config页面直接配置
- 参考
Jenkins插件名称:Parameterized Scheduler
插件链接:Parameterized Scheduler插件官方文档
这个是官方文档,其中包含了安装,介绍,使用示例,Issues等相关信息。
config位置:configure->Build Triggers->Build periodically with parameters
下面为对官方文档的机翻+自我理解和使用实例补充。
什么是Parameterized Scheduler?
Parameterized Scheduler是一个 Jenkins 插件,支持在构建计划中设置参数。支持使用多个 cron 行,每个 cron 行都以 % 和一些键值对name=value结尾,可以安排参数化构建在不同时间使用不同参数运行 。
能在不同的cron表达式下设置不同的参数值,可以同时设置多个参数值。
安装参考:https://www.jenkins.io/doc/book/managing/plugins/
安装完之后,配置页面config会有如下标识:
如何配置实现呢?
Build periodically with parameters
中%
符号之前的 cron表达式
的编写和处理方式与 jenkins 中的 Build periodically Schedule
相同。不同的是Build periodically with parameters
在corn表达式
后加%
,然后添加项目构建参数所需的name=value
键值对,可以同时添加多个。
这个插件的idea
源于Job流程构建时可能会使用到不同环境的需要。在不同的定时构建条件下,构建流程的参数可以设置为不同的,从而控制流程的开合。
其中Build periodically Schedule
中cron表达式
类似为
triggers{
cron('H * * * *')
}
Build periodically with parameters
的cron表达式
设置可参考下文:
示例一,不同corn表达式指定单个参数的值
在此示例中,有两个cron表达式,表示的是两种定时构建方案。
其中每隔15min触发的Job流程里,Job参数会被设置为env=int
;
其中每隔30min触发的Job流程里,Job参数会被设置为env=qa
;
# lets run against the integration environment at 15 past the hour
15 * * * * %env=int
# run QA too
30 * * * * %env=qa
在pipeline中该代码片段为
triggers {
parameterizedCron('''
15 * * * * %env=int
30 * * * * %env=qa
''')
}
示例二,不同corn表达式指定多个参数的值
比如有三个参数:
● furniture
● color
● name (with a default of fred
可以使用如下流程:
# leave spaces where you want them around the parameters. They'll be trimmed.
# we let the build run with the default name
5 * * * * %furniture=chair;color=black
# now, let's override that default name and use Mr. Rubble.
10 * * * * %furniture=desk;color=yellow;name=barney
表示每5min触发一次Job流程,Job参数会被设置为,furniture=chair;color=black
每20min触发一次的Job流程,Job参数会被设置为,furniture=desk;color=yellow;name=barney
在pipeline中该代码片段为
triggers {
parameterizedCron('''
5 * * * * %furniture=chair;color=black
10 * * * * %furniture=desk;color=yellow;name=barney
''')
}
声明式pipeline 配置例子
可以使用触发器指令下的keyparameterizedCron
来指定参数化 cron 触发器。内置的 cron 触发器仍然可用,并且独立于parameterizedCron
。
例子
pipeline {
agent any
parameters {
string(name: 'PLANET', defaultValue: 'Earth', description: 'Which planet are we on?')
string(name: 'GREETING', defaultValue: 'Hello', description: 'How shall we greet?')
}
triggers {
parameterizedCron('''
# leave spaces where you want them around the parameters. They'll be trimmed.
# we let the build run with the default name
*/2 * * * * %GREETING=Hola;PLANET=Pluto
*/3 * * * * %PLANET=Mars
''')
}
stages {
stage('Example') {
steps {
echo "${params.GREETING} ${params.PLANET}"
script { currentBuild.description = "${params.GREETING} ${params.PLANET}" }
}
}
}
}
使用when/triggeredBy指令
when
指令的选项之一是triggeredBy子句
。当使用内置的 cron 触发器
时,应该使用triggedBy 'TimerTrigger'
。但是,parameterizedCron 触发器
与内置触发器是不同的触发器,因此应该相应地更新triggeredBy
,为 triggeredBy 'ParameterizedTimerTriggerCause'
。
内置的cron 触发器中cron表达式结合when/triggeredBy指令
使用Build periodically Schedule
中cron表达式
,执行 控制某阶段 只能在定时构建时才触发这个流程时,需要写为:
pipeline {
agent any
parameters {
string(name: 'PLANET', defaultValue: 'Earth', description: 'Which planet are we on?')
string(name: 'GREETING', defaultValue: 'Hello', description: 'How shall we greet?')
}
triggers {
cron('*/2 * * * *')
stages {
stage('Example') {
when {
triggeredBy 'TimerTrigger'
}
steps {
echo 'This build was triggered by a `parameterizedCron` trigger'
}
}
}
}
parameterizedCron 触发器中cron表达式结合when/triggeredBy指令
使用Build periodically with parameters
中cron表达式
,执行 控制某阶段 只能在定时构建时才触发这个流程时,需要写为:
Groovy
pipeline {
agent any
parameters {
string(name: 'PLANET', defaultValue: 'Earth', description: 'Which planet are we on?')
string(name: 'GREETING', defaultValue: 'Hello', description: 'How shall we greet?')
}
triggers {
parameterizedCron('''
# leave spaces where you want them around the parameters. They'll be trimmed.
# we let the build run with the default name
*/2 * * * * %GREETING=Hola;PLANET=Pluto
*/3 * * * * %PLANET=Mars
''')
stages {
stage('Example') {
when {
triggeredBy 'ParameterizedTimerTriggerCause'
}
steps {
echo 'This build was triggered by a `parameterizedCron` trigger'
}
}
}
}
相当于该阶段stage('Example')
只在 参数化定时构建(parameterizedCron
) 触发流程时才会执行该阶段流程。手动触发该流程不会触发到这个阶段流程。
parameterizedCron 触发器中cron表达式参数控制stage执行
下面这个示例流程则是,当3点定时触发时,TEST_MODE=Daily
,会触发stage('daily_test')
而不会触发stage('weekly_test')
;
当4点定时触发Job时,TEST_MODE=Weekly,会触发stage('weekly_test')而不会触发
stage('daily_test')`;
Groovy
pipeline {
agent any
parameters {
string(name: 'TEST_MODE', defaultValue: '', description: 'TEST MODE: Daily Weekly')
}
triggers {
parameterizedCron('''
H 3 * * * %TEST_MODE=Daily
H 4 * * * %TEST_MODE=Weekly
''')
stages {
stage('daily_test') {
when {
environment name: 'TEST_MODE', value: 'Daily'
beforeAgent true
}
steps {
echo 'Daily Test'
}
}
stage('weekly_test') {
when {
environment name: 'TEST_MODE', value: 'Weekly'
beforeAgent true
}
steps {
echo 'WeeklyTest'
}
}
}
}
这样就能实现在不同时间点,控制传递给Job的参数值,并根据参数值控制执行不同流程。
脚本化管道示例
在脚本式管道要实现这个,可以参考下文:
properties([
parameters([
string(name: 'PLANET', defaultValue: 'Earth', description: 'Which planet are we on?'),
string(name: 'GREETING', defaultValue: 'Hello', description: 'How shall we greet?')
]),
pipelineTriggers([
parameterizedCron('''
*/2 * * * * %GREETING=Hola;PLANET=Pluto
*/3 * * * * %PLANET=Mars
''')
])
])