Как выполнять действия для неудачных сборок в файле Jenkinsfile
Есть ли способ выполнить очистку (или откат), если сбой сборки в Jenkinsfile не удалось?
Я хотел бы сообщить нашему экземпляру Atlassian Stash, что сборка завершилась неудачно (выполнив curl
по правильному URL-адресу).
В принципе, это будет пост-шаг, когда статус сборки установлен на сбой.
Должен ли я использовать try {} catch ()
? Если да, какой тип исключения я должен уловить?
Ответы
Ответ 1
В настоящее время я также ищу решение этой проблемы. Пока лучшее, что я мог придумать, это создать функцию-оболочку, которая запускает код конвейера в блоке 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: "[email protected]",body: "..."
throw e; // rethrow so the build is considered failed
}
}
}
}
Ответ 2
Начиная с 2017-02-03, Declarative Pipeline Syntax 1.0 можно использовать для достижения этой функциональности шага после сборки.
Это новый синтаксис для построения Pipelines, который расширяет Pipeline с заранее определенной структурой и некоторыми новыми шагами, которые позволяют пользователям определять агентов, отправлять сообщения, настройки среды, учетные данные и этапы.
Вот пример файла Jenkins с декларативным синтаксисом:
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 - это то, что обрабатывает действие после шага
Ссылка на декларативный трубопровод Синтаксис здесь