Jenkins Declarative Pipeline中不允许多次使用stages的解决方法

91次阅读
没有评论

问题描述

在使用Jenkins Declarative Pipeline时,希望在一个阶段中使用parallel来并行执行多个子阶段,但在尝试时遇到了错误提示It is not allowed to use stages more than once。用户想要实现类似于给出的示例图的Pipeline结构。

解决方案

以下解决方案基于提供的问答数据及回答内容。在实际操作时,注意根据自己的需求做适当的调整。

解决方案1 – 使用阶段内部的子阶段

Jenkins Declarative Pipeline要求在不同的阶段中定义不同的stages块,而不是在同一阶段内使用多个stages块。以下是修正后的Pipeline代码示例:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'from build'
            }
        }
        stage('Test') {
            steps {
                script {
                    parallel(
                        "GUI": {
                            stage("Tests_A") {
                                steps {
                                    echo 'from A'
                                }
                            }
                            stage("Archive") {
                                steps {
                                    echo 'from Publish'
                                }
                            }
                        },
                        "API": {
                            stage("Tests_B") {
                                steps {
                                    echo 'from B'
                                }
                            }
                        },
                        "CLI": {
                            stage("Tests_C") {
                                steps {
                                    echo 'from C'
                                }
                            }
                        }
                    )
                }
            }
        }
    }
}

在这个解决方案中,我们将并行执行的子阶段放在了一个名为Test的阶段内部,然后使用parallel块来并行执行不同的子阶段。每个子阶段的操作都位于相应的阶段内部,没有额外的stages块。

解决方案2 – 使用外部脚本来控制顺序

如果你想要更灵活地控制阶段的顺序,你可以考虑使用外部脚本或工具来管理。这可能会增加一些复杂性,但能够更精确地控制每个阶段的执行顺序。

以下是一个伪代码示例,展示了如何使用外部脚本来控制阶段的顺序:

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'from build'
            }
        }
        stage('Test') {
            steps {
                script {
                    sh './path/to/your/script.sh'
                }
            }
        }
    }
}

然后在script.sh脚本中,你可以编写逻辑来依次执行需要的阶段,达到你所需的顺序。

请注意,这种方法需要你自己编写脚本,并确保脚本能够正确地管理阶段的顺序。

最佳解决方案

在Jenkins Declarative Pipeline中,使用解决方案1是推荐的做法,因为它更符合Pipeline的声明式风格,而且可读性较高。解决方案2适用于需要更高度自定义的情况,但可能需要更多的额外工作来编写和维护脚本。

请根据你的具体需求选择适合你的解决方案。

参考链接:
Jenkins Declarative Pipeline Documentation
StackOverflow Answer

正文完