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

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

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

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

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


person Krzysztof Krasoń    schedule 25.04.2016    source источник


Ответы (3)


Я сейчас тоже ищу решение этой проблемы. Пока лучшее, что я смог придумать, — это создать функцию-оболочку, которая запускает код конвейера в блоке try catch. Если вы также хотите уведомить об успехе, вы можете сохранить Exception в переменной и переместить код уведомления в блок 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: "[email protected]",body: "..."
                throw e; // rethrow so the build is considered failed                        
            } 
        }
    }
}
person Till Kuhn    schedule 04.05.2016
comment
Бонусные баллы за TimestamperBuildWrapper, я не знал, что он существует - person Krzysztof Krasoń; 06.05.2016
comment
Я использовал try { } finally { } в паре мест в моем Jenkinsfile, и это сработало чудесно. Я также хотел бы отметить, что блоки try/catch/finally не нужно разбивать на отдельные функции или функции-оболочки — они прекрасно работают в любом месте заскриптованного конвейера. - person jayhendren; 03.08.2017

С 03 февраля 2017 г. декларативный синтаксис конвейера 1.0 может использоваться для достижения этой функциональности шага после сборки.

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

Вот пример Jenkinsfile с декларативным синтаксисом:

pipeline {
  agent  label:'has-docker', dockerfile: true
  environment {
    GIT_COMMITTER_NAME = "jenkins"
    GIT_COMMITTER_EMAIL = "[email protected]"
  }
  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:"[email protected]", subject:"SUCCESS: ${currentBuild.fullDisplayName}", body: "Yay, we passed."
    }
    failure {
      mail to:"[email protected]", subject:"FAILURE: ${currentBuild.fullDisplayName}", body: "Boo, we failed."
    }
  }
}

Блок кода post — это то, что обрабатывает это действие шага публикации.

Справочник по синтаксису декларативного конвейера находится здесь

person amarruedo    schedule 16.03.2017
comment
спасибо за спасение - person IslamTaha; 10.02.2020

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

}
person IslamTaha    schedule 10.02.2020