Jenkins チュートリアル 説明 パイプライン プラグインを読んだ後、プラグインはPost-Buildステップ。ただし、ドキュメントは特定の指示に関してかなり制限されています。
たとえば、私はどのように実装するのだろうか:
- ビルドが成功した場合にのみ実行
- ビルドが成功または不安定な場合にのみ実行
- ビルド結果に関係なく実行
ビルドが成功した場合のみ実行する
stage 'build'
... build
... tests
stage 'post-build'
...
(または-Dmaven.test.failure.ignore=false
をMAVEN_OPTS
に追加します)
ビルドが成功または不安定な場合にのみ実行します
stage 'build'
... build
try {
... tests
} catch {
...
}
stage 'post-build'
...
(または-Dmaven.test.failure.ignore=true
をMAVEN_OPTS
に追加します)
ビルド結果に関係なく実行する-try / catch / finally
を使用して実行できますか?
try {
stage 'build'
...
} catch {
...
} finally {
stage 'post-build'
...
}
(いくつかの段階、つまり 'build')がベースとして設定に失敗したにもかかわらず、最終ビルドステータスがSUCCESSに設定されていることに気付きました最終段階で。つまり、最終ビルドステータスを明示的に設定する必要があります。つまり、currentBuild.result = 'UNSTABLE'
?)
最良の方法は、パイプラインスクリプトでビルド後のアクションを使用することです。
失敗の処理
Declarative Pipelineは、そのpostセクションを介して、デフォルトで堅牢な障害処理をサポートします。パイプライン構文セクションでは、さまざまな事後条件の使用方法について詳しく説明しています。
Jenkinsfile(宣言的パイプライン)
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'make check'
}
}
}
post {
always {
junit '**/target/*.xml'
}
failure {
mail to: [email protected], subject: 'The Pipeline failed :('
}
}
}
ドキュメントは以下にあります https://jenkins.io/doc/book/pipeline/syntax/#post
Try/catchを使用していて、ビルドを不安定または失敗としてマークする場合は、currentBuild.result = 'UNSTABLE'などを使用する必要があります。 junitの結果をテストします。ただし、ほとんどの場合、エラーをキャッチする場合は自己設定する必要があります。
続行したくない場合の2番目のオプションは、エラーを再スローすることです。
stage 'build'
... build
try {
... tests
} catch(err) {
//do something then re-throw error if needed.
throw(err)
}
stage 'post-build'
...
FWIW、宣言されていないスクリプトパイプラインを使用している場合、他の回答で提案されているtry/catch/finally
ブロックを使用する必要があります。 finally
ブロックで、宣言型パイプラインの機能を模倣する場合は、ブロックに直接以下を配置するか、それを関数にしてfinally
ブロックからその関数を呼び出すことができます。
def currResult = currentBuild.result ?: 'SUCCESS'
def prevResult = currentBuild.previousBuild?.result ?: 'NOT_BUILT'
// Identify current result
boolean isAborted = (currResult == 'ABORTED')
boolean isFailure = (currResult == 'FAILURE')
boolean isSuccess = (currResult == 'SUCCESS')
boolean isUnstable = (currResult == 'UNSTABLE')
boolean isChanged = (currResult != prevResult)
boolean isFixed = isChanged && isSuccess && (prevResult != 'ABORTED') && (prevResult != 'NOT_BUILT')
boolean isRegression = isChanged && currentBuild.resultIsWorseOrEqualTo(prevResult)
onAlways()
if (isChanged) {
onChanged()
if (isFixed) {
onFixed()
} else if (isRegression) {
onRegression()
}
}
if (isSuccess) {
onSuccess()
} else {
if (isAborted) {
onAborted()
}
onUnsuccessful()
if (isFailure) {
onFailure()
}
if (isUnstable) {
onUnstable()
}
}
onCleanup()
さまざまなonXYZ()
呼び出しは、宣言post
ブロックのより良い構文を使用する代わりに、その特定の条件を処理するために定義する関数です。
try-catch
ブロックは、実際のアプリケーションコードのようにエラーを処理するように設定できます。
例えば:
try {
node {
sh 'sleep 20' // <<- can abort here
}
} catch (Exception e) {
println 'catch'
} finally {
println 'finally'
}
node {
println 'second'
}
try {
node {
sh 'sleep 20' // <<- can abort here again
}
} catch (Exception e) {
println 'catch'
} finally {
println 'finally'
}
次に、2つのアボートを伴う出力例を示します。
Started by user me
Replayed #3
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] sh
[my-job] Running Shell script
+ sleep 20
Aborted by me
Sending interrupt signal to process
/var/lib/jenkins-slave/workspace/my-job@tmp/durable-9e1a15e6/script.sh: line 2: 10411 Terminated sleep 20
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
catch
[Pipeline] echo
finally
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] echo
second
[Pipeline] }
[Pipeline] // node
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] sh
[my-job] Running Shell script
+ sleep 20
Aborted by me
Sending interrupt signal to process
/var/lib/jenkins-slave/workspace/my-job@tmp/durable-d711100c/script.sh: line 2: 10416 Terminated sleep 20
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
catch
[Pipeline] echo
finally
[Pipeline] End of Pipeline
Finished: ABORTED
もちろん、これは実行中に発生する例外に対して機能します。