根据我使用Jenkins声明性语法管道的经验,我知道您可以有条件地跳过when
子句的一个阶段。
run_one = true
run_two = false
run_three = true
pipeline {
agent any
stages {
stage('one') {
when {
expression { run_one }
}
steps {
echo 'one'
}
}
stage('two') {
when {
expression { run_two }
}
steps {
echo 'two'
}
}
stage('three') {
when {
expression { run_three }
}
steps {
echo 'three'
}
}
}
}
...在上面的代码块中,有三个阶段,one
、two
和three
,每个阶段的执行都取决于布尔变量。
即,该范例是存在已知阶段的固定超集,其中各个阶段可以有条件地跳过。
Jenkins管道脚本是否支持不存在已知阶段的固定超集且可“查找”阶段以进行条件执行的模型?
用伪代码来描述它,可能是以下几种情况:
my_list = list populated _somehow_, maybe reading a file, maybe Jenkins build params, etc.
pipeline {
agent any
stages {
if (stage(my_list[0]) exists) {
run(stage(my_list[0]))
}
if (stage(my_list[1]) exists) {
run(stage(my_list[1]))
}
if (stage(my_list[2]) exists) {
run(stage(my_list[2]))
}
}
}
?
我想用另一种方式来思考我的问题:有没有一种方法可以从一些动态的阶段集合中动态地构建一个管道?
1条答案
按热度按时间u5i3ibmn1#
对于动态阶段,您可以编写完全脚本化的管道,也可以使用带有脚本部分的声明性管道(例如,通过使用
script {…}
步骤或调用您自己的函数)。有关概述,请参阅声明性与脚本化管道语法和管道语法概述。声明式管道在Blue Ocean中得到了更好的支持,所以我个人会将其作为起点。缺点可能是需要有一个固定的根阶段,但我通常将其命名为“start”或“init”,这样看起来就不会太尴尬。
在脚本部分中,可以将
stage
作为 function 调用,因此可以完全动态地使用它。这显示在蓝海这样: