仅在上一阶段在Jenkins脚本化管道中成功时才运行阶段

时间:2018-12-05 18:11:23

标签: jenkins jenkins-pipeline

我正在尝试在Jenkins脚本化管道中运行条件步骤,但是我不确定如何仅在上一步成功的情况下运行步骤。例如,在下面的示例中,如果“测试”阶段成功,我只想运行“推送工件”阶段:

node ('docker2') {

    stage ('Build') {
        // build application
    }

    stage ('Test') {
        // run tests
    }

    stage ('Push Artifacts') { 
        if (Tests Were Successful) {  
            // push to artifactory
        }
    }
}

我知道声明性管道允许您使用“ post”条件,但是我对Jenkins中的声明性管道与脚本化管道的理解是,脚本化管道提供了更大的灵活性。有没有一种方法可以基于脚本管道中其他阶段的成功来运行阶段?

1 个答案:

答案 0 :(得分:1)

jenkins管道中没有成功步骤或失败步骤的概念。只有构建状态(成功,失败,不稳定等)

您有两种解决问题的方法:

首先。如果测试失败(使用“错误” jenkins步骤),则可以使管道失败。例如:

stage('Build') {
    // build application
}

stage('Test') {
    def testResult = ... // run command executing tests
    if (testResult == 'Failed') {
        error "test failed"
    }
}

stage('Push Artifacts') {
    //push artifacts
}

或者,如果您的命令在测试失败时传播错误(例如“ mvn测试”),则您可以这样编写:

stage('Build') {
    // build application
}

stage('Test') {
    sh 'mvn test'
}

stage('Push Artifacts') {

}

在这些情况下,测试失败时您的管道将失败。 “测试”阶段之后的任何阶段都不会执行。

第二。如果只想执行某些步骤,则应根据执行的步骤将测试结果写入变量。您可以在运行步骤之前分析该变量的值。例如:

stage('Build') {
    // build application
}

boolean testPassed = true
stage('Test') {
    try{
        sh 'mvn test'
    }catch (Exception e){
        testPassed = false
    }
}

stage('Push Artifacts') {
    if(testPassed){
        //push to artifactory
    }
}