Как выполнить действия для неудачных сборок в Jenkinsfile

Есть ли способ выполнить очистку (или откат), если сборка в Jenkinsfile не удалась?

Я хотел бы сообщить нашему экземпляру Atlassian Stash, что сборка не удалась (выполнив curl на правильный URL).

По сути, это будет последующий шаг, когда состояние сборки не будет установлено.

Должен ли я использовать try {} catch ()? Если да, то какой тип исключения я должен поймать?

2 ответа

Решение

В настоящее время я также ищу решение этой проблемы. Пока что лучшее, что я могу придумать, - это создать функцию-обертку, которая запускает конвейерный код в блоке try catch. Если вы также хотите уведомить об успехе, вы можете сохранить Исключение в переменной и переместить код уведомления в блок finally. Также обратите внимание, что вы должны перебросить исключение, чтобы Дженкинс счел сборку неудачной. Может быть, какой-то читатель найдет более элегантный подход к этой проблеме.

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                        
            } 
        }
    }
}

Начиная с 2017-02-03, декларативный синтаксис конвейера 1.0 может использоваться для реализации этого шага после сборки.

Это новый синтаксис для построения конвейеров, который расширяет конвейер с заранее определенной структурой и некоторыми новыми шагами, которые позволяют пользователям определять агентов, действия после публикации, параметры среды, учетные данные и этапы.

Вот пример 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."
    }
  }
}

Блок почтового кода - это то, что обрабатывает действие после шага

Ссылка на декларативный синтаксис конвейера здесь

Мне удается решить эту проблему, используя 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
            """
        }
    }

}
Другие вопросы по тегам