在声明性 Jenkinsfile 中重用并行阶段

时间:2021-03-26 10:23:50

标签: jenkins jenkins-declarative-pipeline

我有一个声明式 Jenkins 管道,其中包含多个并行运行的相同阶段。我想重用这些部分,但到目前为止,我能够实现的最佳效果如下:

stage('Deploy & E2E') {
    parallel {
        stage('E2E 1') {
            agent { ... }
            environment { ... }
            steps {
                script { runE2ESteps() }
            }
            post { ... }
        }
        stage('E2E 2') {
            agent { ... }
            environment { ... }
            steps {
                script { runE2ESteps() }
            }
            post { ... }
        }
        stage('Other unrelated stage, not wanting reuse') {
            agent { ... }
            environment { ... }
            steps {
                // something else
            }
            post { ... }
        }
    }
}

我能够部分重用位,通过将步骤提取到一个方法中,但是在 agentenvironmentpost 块。理想情况下,我想写一些类似的东西:

stage('Deploy & E2E') {
    parallel {
        script {
            for (int i = 0; i < 5; i++) {
                stage('E2E ${i}') {
                    agent { ... }
                    environment { ... }
                    steps { ... }
                    post { ... }
                }
            }
        }
        stage('Other unrelated stage, not wanting reuse') {
            agent { ... }
            environment { ... }
            steps {
                // something else
            }
            post { ... }
        }
    }
}

但显然我不能在声明性的土地上这样做 - 詹金斯似乎非常挑剔你在文件中的不同点被允许拥有的确切内容。

我也尝试了其他一些方法,但都没有奏效:

  • 在 E2E 块中使用 matrix 似乎很有希望,但不允许将 matrix 嵌套在 parallel 中,所以这没有成功(因为还有其他不相关的阶段我们希望与 E2E 步骤并行运行)
  • 使用内嵌的 parallel 命令。这并没有达到我想要的效果,因为我需要在自己的代理中运行每个阶段(不在同一个代理中并行)。

我附上了管道外观的图表 - 它现在的行为与我想要的完全一样,只是重复的代码比我想要的要多。如果我们想改变 E2E 的并行性,目前涉及复制+粘贴或删除代码块,而不是(理想情况下)在某处更改一个数字。

也许这是不可能的,但我想我最好还是扔掉一个帖子,看看是否有我遗漏的任何想法。

Diagram

1 个答案:

答案 0 :(得分:0)

stage('Deploy & E2E') {
    parallel {
        script {
        stage('Other unrelated stage, not wanting reuse') {
            agent { ... }
            environment { ... }
            steps {
                // something else
            }
            post { ... }
        }
            for (int i = 0; i < 5; i++) {
                stage('E2E ${i}') {
                    agent { ... }
                    environment { ... }
                    steps { ... }
                    post { ... }
                }
            }
        }
    }
}

试试