私はJenkinsパイプラインの条件付きステージに相当するものを再現しようとしています。先行するステージの周りにtry/catchを使用し、成功変数を設定して、条件付きステージのトリガーに使用します。
トライ・キャッチ・ブロックは、成功変数をSUCCESSまたはFAILEDに設定し、後で(条件付きステージの一部として)whenステートメントの一部として使用される方法のようです。
私が使用しているコードは以下の通りです。
pipeline {
agent any
stages {
try{
stage("Run unit tests"){
steps{
sh '''
# Run unit tests without capturing stdout or logs, generates cobetura reports
cd ./python
nosetests3 --with-xcoverage --nocapture --with-xunit --nologcapture --cover-package=application
cd ..
'''
currentBuild.result = 'SUCCESS'
}
}
} catch(Exception e) {
// Do something with the exception
currentBuild.result = 'SUCCESS'
}
stage ('Speak') {
when {
expression { currentBuild.result == 'SUCCESS' }
}
steps{
echo "Hello, CONDITIONAL"
}
}
}
}
私が受け取っている最新のシンタックスエラーは以下の通りです。
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup
failed:
WorkflowScript: 4: Expected a stage @ line 4, column 9.
try{
また、いろいろなバリエーションを試してみました。
私のアプローチは間違っていますか?これはかなり一般的な要求のように思えます。
ありがとうございます。
これにより、目的に応じて問題を解決できるかもしれません。ステージは、先行するステージが成功したときにのみ実行されるので、あなたの例のように実際に2つのステージがあり、最初のステージが成功したときにのみ2番目のステージを実行したい場合は、テストが失敗したときに最初のステージが適切に失敗するようにしたいと考えています。Catchingは(望ましい)失敗を防ぎます。Finallyは失敗を保持し、テスト結果を取得するのにも使用できます。
つまりここでは、テストが成功したときにのみ第2ステージが実行され、テスト結果は関係なく記録されます。
pipeline {
agent any
stages {
stage("Run unit tests"){
steps {
script {
try {
sh '''
# Run unit tests without capturing stdout or logs, generates cobetura reports
cd ./python
nosetests3 --with-xcoverage --nocapture --with-xunit --nologcapture --cover-package=application
cd ..
'''
} finally {
junit 'nosetests.xml'
}
}
}
}
stage ('Speak') {
steps{
echo "Hello, CONDITIONAL"
}
}
}
}
なお、私は実際に宣言型パイプラインでtry
を使っていますが、StephenKing氏が言うように、tryを直接使うことはできません(任意のgroovyコードをスクリプトステップでラップする必要があります)。