16

如果 Jenkinsfile 中的构建失败,有没有办法执行清理(或回滚)?

我想通知我们的 Atlassian Stash 实例构建失败(通过curl在正确的 URL 处执行)。

基本上,当构建状态设置为失败时,这将是一个后期步骤。

我应该使用try {} catch ()吗?如果是这样,我应该捕获什么异常类型?

4

3 回答 3

26

自 2017-02-03 起,声明性管道语法 1.0可用于实现此构建后步骤功能。

它是一种用于构建 Pipelines 的新语法,它使用预定义的结构和一些新步骤扩展 Pipeline,使用户能够定义代理、发布操作、环境设置、凭据和阶段。

这是一个带有声明性语法的示例 Jenkinsfile:

pipeline {
  agent  label:'has-docker', dockerfile: true
  environment {
    GIT_COMMITTER_NAME = "jenkins"
    GIT_COMMITTER_EMAIL = "jenkins@jenkins.io"
  }
  stages {
    stage("Build") {
      steps {
        sh 'mvn clean install -Dmaven.test.failure.ignore=true'
      }
    }
    stage("Archive"){
      steps {
        archive "*/target/**/*"
        junit '*/target/surefire-reports/*.xml'
      }
    }
  }
  post {
    always {
      deleteDir()
    }
    success {
      mail to:"me@example.com", subject:"SUCCESS: ${currentBuild.fullDisplayName}", body: "Yay, we passed."
    }
    failure {
      mail to:"me@example.com", subject:"FAILURE: ${currentBuild.fullDisplayName}", body: "Boo, we failed."
    }
  }
}

代码块是处理后步骤操作的内容

声明性管道语法参考在这里

于 2017-03-16T08:14:40.447 回答
21

我目前也在寻找解决这个问题的方法。到目前为止,我能想到的最好的方法是创建一个包装函数,在 try catch 块中运行管道代码。如果您还想通知成功,您可以将异常存储在变量中并将通知代码移动到 finally 块。另请注意,您必须重新抛出异常,以便 Jenkins 认为构建失败。也许一些读者找到了解决这个问题的更优雅的方法。

pipeline('linux') {
    stage 'Pull'
    stage 'Deploy'
    echo "Deploying"
    throw new FileNotFoundException("Nothing to pull")
    // ... 
}

 def pipeline(String label, Closure body) {
     node(label) {
        wrap([$class: 'TimestamperBuildWrapper']) {
            try {
                body.call()
            } catch (Exception e) {
                emailext subject: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - FAILURE (${e.message})!", to: "me@me.com",body: "..."
                throw e; // rethrow so the build is considered failed                        
            } 
        }
    }
}
于 2016-05-04T14:10:12.277 回答
0

我设法通过使用 try:finally 来解决它。如果这个阶段出现错误,阶段将是红色的,最后运行代码,但如果阶段没问题,阶段将是绿色的,最后也会运行。

stage('Tests'){
    script{
        try{
            sh """#!/bin/bash -ex
                docker stop \$(docker ps -a -q)
                docker rm \$(docker ps -a -q)
                export DOCKER_TAG=${DOCKER_TAG}
                docker-compose -p ${VISUAL_TESTING_PROJECT_TAG} build test
                docker-compose -p ${VISUAL_TESTING_PROJECT_TAG} up --abort-on-container-exit --exit-code-from test
        """     
        }
        finally{
            sh """#!/bin/bash -ex
            export DOCKER_TAG=${DOCKER_TAG}
            docker-compose -p ${VISUAL_TESTING_PROJECT_TAG} down
            """
        }
    }

}
于 2020-02-10T16:17:30.973 回答