发布失败JenkinsFile无效

时间:2017-04-10 08:31:54

标签: jenkins jenkins-pipeline

我尝试使用并行步骤进行后失败操作,但它永远不会有效。

这是我的JenkinsFile:

pipeline {
    agent any

    stages {

        stage("test") {

            steps {

                withMaven(
                            maven: 'maven3', // Maven installation declared in the Jenkins "Global Tool Configuration"
                            mavenSettingsConfig: 'maven_id', // Maven settings.xml file defined with the Jenkins Config File Provider Plugin
                            mavenLocalRepo: '.repository') {
                                // Run the maven build
                                sh "mvn --batch-mode release:prepare -Dmaven.deploy.skip=true" --> it will always fail
                            }       
            }
        }

        stage("testing") {
            steps {
                parallel (
                    phase1: { sh 'echo phase1'},
                    phase2: { sh "echo phase2" }
                    )
            }
        }

    }

    post {

        failure {

            echo "FAIL"
        }
    }
}

但这里的失败后行动有点用处......我看不到任何地方。

感谢大家! 此致

2 个答案:

答案 0 :(得分:8)

经过几个小时的搜索,我发现了这个问题。您遗失的内容(我也遗失了)是catchError部分。

pipeline {
    agent any
    stages {
        stage('Compile') {
           steps {
                catchError {
                    sh './gradlew compileJava --stacktrace'
                }
            }
            post {
                success {
                    echo 'Compile stage successful'
                }
                failure {
                    echo 'Compile stage failed'
                }
            }
        }
        /* ... other stages ... */
    }
    post {
        success {
            echo 'whole pipeline successful'
        }
        failure {
            echo 'pipeline failed, at least one step failed'
        }
    }

您应该将可能失败的每一步都包装到catchError函数中。这样做是:

  • 如果发生错误......
  • ...将build.result设为FAILURE ...
  • ... 继续构建

最后一点非常重要:您的post{ }块未被调用,因为您的整个管道在中止之后才有机会执行。

答案 1 :(得分:0)

以防万一其他人也犯了我同样的愚蠢错误,请不要忘记post块必须位于pipeline块内。

即这显然是有效的,但是(显然)不起作用:

pipeline {
  agent { ... }
  stages { ... }
}
// WRONG!
post {
  always { ... }
}

这是正确的:

pipeline {
  agent { ... }
  stages { ... }
  post {
    always { ... }
  }
}