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

6tqwzwtp  于 2023-01-29  发布在  Jenkins
关注(0)|答案(2)|浏览(169)

我有一个声明式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 { ... }
        }
    }
}

但显然我不能这样做,在申报土地-Jenkins似乎非常挑剔,究竟是什么,你被允许在文件中的各个点。
我也尝试过其他几种方法,但都不奏效:

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

我附上了一张管道的示意图--它现在的行为完全符合我的要求,只是代码重复比我希望的要多。如果我们想改变E2 E的并行性,目前需要复制+粘贴或删除一个代码块,而不是(理想情况下)在某个地方更改一个数字。
也许这是不可能的,但我想我不妨扔掉一个职位,看看是否有任何想法,我错过了。

idfiyjo8

idfiyjo81#

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 { ... }
                }
            }
        }
    }
}

试一试

hgqdbh6s

hgqdbh6s2#

我们在Jenkins中没有找到解决这个问题的方法,最后,我们转向Github Actions,在那里可以使用矩阵作业。

相关问题