Jenkins动态生成的流水线阶段后模拟post步骤

136次阅读
没有评论

问题描述

在Jenkins中使用动态生成的流水线阶段,但无法为这些动态阶段创建post步骤。他希望能够使用类似下面的代码来实现post步骤:

pipeline {
    agent none
    stages {
        stage('Gen Stages') {
            steps {
                script {
                    def stageNames = ["st1", "st2", "st3"]
                    stageNames.each { stageName ->
                        createStage(stageName)
                    }
                }
            }
        }
    }
    post {
        always {
            echo "post > always"
        }
        success {
            echo "post > success"
        }
    }
}
def createStage(String stageName) {
    stage(stageName) {
        echo "Stage: ${stageName}"
    }
    // 我想取消注释并使用下面的代码 - 或者类似的代码:
    // post {
    //     always {
    //         echo "${stageName} > post > always"
    //     }
    //     success {
    //         echo "${stageName} > success > always"
    //     }
    // }
}

他希望能够使用注释掉的post {}步骤,或者类似的方法来实现。
如果可能的话,他希望尽可能使用DSL,并避免使用脚本流水线。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

你无法使用post,因为post是声明式DSL的一部分,而不是脚本化的。而你是在script块中定义你的阶段。所以只要你在使用script块来定义你的阶段,你就必须坚持使用脚本化的方法,即使用Groovy的try { ... } catch { ... } finally { ... }结构。例如:

def createStage(String stageName) {
    stage(stageName) {
        try {
            echo "Stage: ${stageName}"
            echo "${stageName} > this is executed only on success"
        } finally {
            echo "${stageName} > this is always executed"
        }
}

在上面的示例中,我们使用try { ... } catch { ... } finally { ... }结构来定义阶段。try块中的代码在阶段执行期间执行,finally块中的代码始终执行。这样可以实现类似于post步骤的效果。

方案2

使用脚本流水线可以更灵活地控制流程,但需要更多的编写和维护工作。
另一种方法是使用脚本流水线来实现更灵活的控制。脚本流水线允许你使用更多的编写和维护工作来控制流程。以下是一个示例:

pipeline {
    agent none
    stages {
        stage('Gen Stages') {
            steps {
                script {
                    def stageNames = ["st1", "st2", "st3"]
                    stageNames.each { stageName ->
                        createStage(stageName)
                    }
                }
            }
        }
    }
}
def createStage(String stageName) {
    stage(stageName) {
        script {
            echo "Stage: ${stageName}"
            echo "${stageName} > this is executed only on success"
            echo "${stageName} > this is always executed"
        }
    }
}

在这个示例中,我们使用脚本流水线来定义阶段。在每个阶段中,我们使用script块来执行需要的操作。这样可以更灵活地控制流程,但需要更多的编写和维护工作。
以上是两种解决方案,你可以根据自己的需求选择适合的方法来实现post步骤的效果。

正文完