Jenkins Pipelineのジョブを成功として時期尚早に終了する最もクリーンな方法は?


55

フィードされる値の1つが古い値と一致しない限り、ファイルを作成するジョブがあります。、仕事を中断または終了するには、ジェンキンスでクリーンな方法何せずにそれがあることはFAILED?終了するのは正しい動作なので、ビルドにマークを付けSUCCESSます。

そのようなifステートメントになります。

stage ('Check value') {

     if( $VALUE1 == $VALUE2 ) {
       //if they do match exit as a success, else continue with the rest of the job 
    }

}

エラーコードが、ビルドの成功としてマークされることに何らかの形で変換できない限り、エラーコードをスローしたくありません。


1
ただexit 0...
Tensibai

私はそれが仕事に失敗したと思ったのですか?私が間違っていて、ドキュメントを表示できる場合は、回答として喜んで受け入れます
アレックス

さて、bashスクリプトだけで、終了0は成功を意味し、ゼロ以外の終了は失敗を意味します
...-Tensibai

これはbashスクリプト内ではなく、これはパイプラインジョブそのものなので、Groovyです。それは物事を変えますか?
アレックス

groovyではreturn 0、例外をスローしないgroovyコードのすべての端で、を試してみてください。ジェンキンス2のバックグラウンドがより高い人に確認または虚弱を
認める

回答:


46

理解した。ステージの外で(そうでなければ、これは特定のステージを成功として終了するだけです)以下を実行します。

if( $VALUE1 == $VALUE2 ) {
   currentBuild.result = 'SUCCESS'
   return
}

return ステージまたはステージ上実行しいるノードを停止するため、ステージ外で実行することが重要currentBuild.resultです。


戻るだけで、ビルドはグレー表示された状態になり、結果は表示されません。そのため、失敗したビルドとまったく同じではありません。
描いた

1
残りのすべてのステージをどのように返し、スキップしますか?
ジェスバウアーズ

1
@JessBowersそれはあなたがスニペットを置く場所についてのすべてです。ステージレベルではなくノードレベルで行うと、ジョブ全体が終了します。
アレックス

4
スクリプトパイプラインでのみ機能し、宣言型では機能しないことに注意してください
-kagarlickij

@kagarlickij-この答えが書かれたとき、正しい宣言的なパイプラインは存在しませんでした!
アレックス

10

また、エラーを使用して現在のステージを終了することもできます。その場合、現在のステージ階層などを考慮する必要はありません。

def autoCancelled = false

try {
  stage('checkout') {
    ...
    if (your condition) {
      autoCancelled = true
      error('Aborting the build.')
    }
  }
} catch (e) {
  if (autoCancelled) {
    currentBuild.result = 'SUCCESS'
    // return here instead of throwing error to keep the build "green"
    return
  }
  // normal error handling
  throw e
}

しかし、ステージ内でエラーが発生した場合、これはレッドステージにつながります。

ここに画像の説明を入力してください

どの方法を使用するかは要件によって異なります。


あなたは、このようにそれをやろうとしている場合は、新しいサブクラスを作成するRuntimeExceptionすべての例外をキャッチし、フラグをチェックする必要の代わりに投げるために
マイケルMrozek

1

正直なところ、特にexitコマンドを使用する必要はありませんが、同じ最終結果(実行されないコード)を達成する可能性のある条件付きBuildStepプラグインがあります。

私はまだこれに思いついていないので、プラグインを使用していません。

Jenkinsのこの前のStack Overflowポストにあるように条件もあります:Jenkins Pipeline Conditional Step / Stage


1
あなたの答えは有効だと思われますが(別の回避策を見つけたのでライブでチェックしていません)、「正直にあなたは終了すべきではありません」はそれを始める良い方法だとは思いません。明らかに、これらのメソッドの存在は、終了する必要があることを意味します。
アレックス

何を提案しますか?最後のステートメントに移動しますか?修飾子を「一般的に」追加しますか?あなたは「フィードバック」を提供しましたが、その意図や行動を伝えるのは簡単ではありません。
-MrMesees

ちょっと待ってください。それはあなたの質問ですか?もしそうなら、TBHは終了するべきではないと聞きたくないでしょうが、私が提案したいずれの方法も終了を提供せず、コードの実行を回避します...
-MrMesees

1
ああ、私はあなたの声明を「文字通りのexitコマンドを使うべきではない」のではなく、「仕事を終わらせるために何かをするのは悪い」と誤解していると思います。
アレックス

3
私はそれをより明確にしようとしましたが、まったく謝罪する必要はありません、言語は気まぐれな獣です、特にインターネット上で:)
MrMesees

0

Executor.interrupt(Result)この方法は、私は途中でビルドを停止するために見つけることができるきれいな、最も直接的な方法である、成功としてそれをマークします。

script {
    currentBuild.getRawBuild().getExecutor().interrupt(Result.SUCCESS)
}

長所

  • スクリプト化されたパイプラインと同様に、宣言的なパイプラインで動作します。
  • try / catchまたは処理する例外はありません。
  • 呼び出し段階と後続の段階をUIで緑/合格としてマークします。

短所

  • 安全でない見なされるものを含め、多数のインプロセススクリプト承認が必要です。承認および使用には注意してください。

私にとっては機能しません-連続したステージが実行されています。
ルカシュK
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.