Как выполнить действия для неудачных сборок в 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
"""
}
}
}