首先,为了澄清一些误解,定义一个实际上是有效的stage
里面的一个script
步。这是向声明性管道动态添加阶段的常见模式。
在一个script
步骤,应用脚本化管道的规则。脚本化管道有一个stage
功能,不需要steps
甚至script
孩子们。一切都在脚本之内stage
还使用脚本语法。
您只需使用 Groovy 即可跳过脚本阶段if
陈述:
script {
if( serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")) ) {
stage('A Stage') {
echo 'Hello'
}
}
}
这样做的缺点是舞台将完全被missing从蓝海管道来看。
我们其实想要的是展示舞台,但在skipped状态,正如我们从声明性管道中使用的那样。这可以通过使用来实现当步骤时势在必行 https://github.com/comquent/imperative-when(有关的博客文章 https://comquent.de/en/skipped-stages-in-jenkins-scripted-pipeline/).
结果并不完美,因为 Blue Ocean 将在舞台上画一条直线(而不是围绕舞台的曲线),但舞台按钮代表跳过状态。
按照描述包含共享库后博客文章 https://comquent.de/en/skipped-stages-in-jenkins-scripted-pipeline/,我们现在可以写:
script {
stage("Test ${test1}") {
when( serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")) ) {
echo 'Hello'
}
}
}
这是使用“命令式”重写的完整示例,并删除了一些过时的代码:
pipeline {
agent any
stages {
stage("Dynamic stages") {
steps {
script {
serverAStatus = false
def tests = CLIENTS.split(',')
def builders = [:]
for (test in tests) {
def test1 = test
builders[test] = {
stage("Test ${test1}") {
when( serverAStatus && (test1.equals("ABC") || test1.equals("XYZ")) ) {
node('master') {
echo "Executing stage ${test1}"
echo "Client is " + test1
}
}
}
}
}
parallel builders
}
}
}
}
}
为了样本的缘故,node('master')
也可以被删除。我将其保留,因为您可能希望在多个节点上并行运行并行阶段。在这种情况下,您可以将“master”替换为公共节点标签或根据变量传递显式节点名称test1
.