Jenkinsfileのビルドが失敗した場合にクリーンアップ(またはロールバック)を実行する方法はありますか?Jenkinsfileで失敗したビルドのアクションを実行する方法
Atlassian Stashインスタンスに、ビルドが失敗したことを通知したいと思います(正しいURLでcurl
を実行することによって)。
ビルドステータスが失敗に設定されているのは、基本的にはポストステップです。
try {} catch()
を使用しますか?もしそうなら、どんな例外タイプを捕まえるべきですか?
Jenkinsfileのビルドが失敗した場合にクリーンアップ(またはロールバック)を実行する方法はありますか?Jenkinsfileで失敗したビルドのアクションを実行する方法
Atlassian Stashインスタンスに、ビルドが失敗したことを通知したいと思います(正しいURLでcurl
を実行することによって)。
ビルドステータスが失敗に設定されているのは、基本的にはポストステップです。
try {} catch()
を使用しますか?もしそうなら、どんな例外タイプを捕まえるべきですか?
現在、この問題の解決方法も探しています。今まで私が思いつくのは、try catchブロックでパイプラインコードを実行するラッパー関数を作成することです。成功を通知したい場合は、例外に変数を格納し、通知コードをfinallyブロックに移動することができます。また、Jenkinsがビルドを失敗と見なすように、例外を再実行する必要があることにも注意してください。たぶん読者によっては、この問題に対するより洗練されたアプローチがあるかもしれません。
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
}
}
}
}
2017年2月3日以来、Declarative Pipeline Syntax 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."
}
}
}
ポストコードブロックは、後工程作用
宣言パイプライン構文基準here
ボーナスポイントであることを扱うものです'TimestamperBuildWrapper'のために、私はそれが存在していたことを知らなかった –
私は' try {} finally {} 'を私のいくつかの場所で使っていましたJenkinsfileと素晴らしく働いた。 try/catch/finallyブロックは、別の関数やラッパー関数に分割する必要はありません。スクリプト化されたパイプラインのどこでもうまく動作します。 – jayhendren