如何在 Jenkinsfile 中对失败的构建执行操作
How to perform actions for failed builds in Jenkinsfile
如果 Jenkinsfile 中的构建失败,是否有执行清理(或回滚)的方法?
我想通知我们的 Atlassian Stash 实例构建失败(通过在正确的 URL 处执行 curl
)。
基本上,当构建状态设置为失败时,这将是一个 post 步骤。
我应该使用 try {} catch ()
吗?如果是这样,我应该捕获什么异常类型?
我目前也在寻找这个问题的解决方案。到目前为止,我能想到的最好办法是创建一个包装函数,在 try catch 块中运行管道代码。如果您还想在成功时发出通知,您可以将异常存储在变量中并将通知代码移至 finally 块。另请注意,您必须重新抛出异常,以便 Jenkins 认为构建失败。也许有人 reader 找到了解决这个问题的更优雅的方法。
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 年 2 月 3 日起,Declarative Pipeline Syntax 1.0 可用于实现此 post 构建步骤功能。
这是一种用于构建 Pipelines 的新语法,它使用预定义结构和一些新步骤扩展 Pipeline,使用户能够定义代理、post 操作、环境设置、凭据和阶段。
这是一个带有声明性语法的示例 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."
}
}
}
post 代码块用于处理 post 步骤操作
声明性管道语法参考是 here
我设法使用 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
"""
}
}
}
如果 Jenkinsfile 中的构建失败,是否有执行清理(或回滚)的方法?
我想通知我们的 Atlassian Stash 实例构建失败(通过在正确的 URL 处执行 curl
)。
基本上,当构建状态设置为失败时,这将是一个 post 步骤。
我应该使用 try {} catch ()
吗?如果是这样,我应该捕获什么异常类型?
我目前也在寻找这个问题的解决方案。到目前为止,我能想到的最好办法是创建一个包装函数,在 try catch 块中运行管道代码。如果您还想在成功时发出通知,您可以将异常存储在变量中并将通知代码移至 finally 块。另请注意,您必须重新抛出异常,以便 Jenkins 认为构建失败。也许有人 reader 找到了解决这个问题的更优雅的方法。
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 年 2 月 3 日起,Declarative Pipeline Syntax 1.0 可用于实现此 post 构建步骤功能。
这是一种用于构建 Pipelines 的新语法,它使用预定义结构和一些新步骤扩展 Pipeline,使用户能够定义代理、post 操作、环境设置、凭据和阶段。
这是一个带有声明性语法的示例 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."
}
}
}
post 代码块用于处理 post 步骤操作
声明性管道语法参考是 here
我设法使用 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
"""
}
}
}