web-dev-qa-db-ja.com

ステップが不安定な場合、Jenkins Pipelineが失敗する

現在、maven-jobが不安定な場合(黄色)、パイプラインが失敗します(赤)。

node {
    stage 'Unit/SQL-Tests'
    parallel (
       phase1: { build 'Unit-Tests' }, // maven
       phase2: { build 'SQL-Tests' } // Shell
    )
    stage 'Integration-Tests'
    build 'Integration-Tests' // maven
}

この例では、ジョブの単体テストの結果は不安定ですが、パイプラインでは失敗として表示されます。

ジョブ/パイプライン/ジェンキンを変更して、(1)失敗ではなくパイプラインステップを不安定にし、(2)失敗ではなくパイプラインのステータスを不安定にするにはどうすればよいですか。

MAVEN_OPTSパラメーター-Dmaven.test.failure.ignore=trueを追加しようとしましたが、問題は解決しませんでした。 build 'Unit-Test'を、結果をキャッチして処理できるロジックにラップする方法がわかりません。

このロジック を使用してサブパイプラインを追加しても、Subversionからチェックアウトするオプションがないため、トリックは実行されません(このオプションは通常のMavenジョブで使用可能です)。可能であれば、コマンドラインチェックアウトを使用したくありません。

15
michaelbahr

ステップが不安定であっても失敗したとしても、スクリプトの最終ビルド結果は失敗します。

フローの失敗を回避するために、デフォルトで伝搬をfalseに追加できます。

def result = build job: 'test', propagate: false

フローの最後に、「結果」変数から得たものに基づいて最終結果を判断できます。

例えば

currentBuild.result='UNSTABLE'

詳細な例を次に示します 現在のビルド結果をパイプラインで設定する方法

Br、

ティム

19
Tim

学んだ教訓:

  • Jenkinsは、SUCCESSUNSTABLE、またはFAILUREsource )のいずれかであるcurrentBuild.result値に従ってパイプラインを継続的に更新します。
  • build job: <JOBNAME>の結果は変数に保存できます。ビルドステータスはvariable.resultにあります。
  • build job: <JOBNAME>, propagate: falseは、ビルド全体がすぐに失敗するのを防ぎます。
  • currentBuild.result悪化のみ可能 。その値が以前にFAILEDであり、currentBuild.result = 'SUCCESS'を介して新しいステータスSUCCESSを受け取った場合、FAILEDのままになります

これは私が最終的に使用したものです:

node {
    def result  // define the variable once in the beginning
    stage 'Unit/SQL-Tests'
    parallel (
       phase1: { result = build job: 'Unit', propagate: false }, // might be UNSTABLE
       phase2: { build 'SQL-Tests' }
    )
    currentBuild.result = result.result  // update the build status. jenkins will update the pipeline's current status accordingly
    stage 'Install SQL'
    build 'InstallSQL'
    stage 'Deploy/Integration-Tests'
    parallel (
       phase1: { build 'Deploy' },
       phase2: { result = build job: 'Integration-Tests', propagate: false }
    )
    currentBuild.result = result.result // should the Unit-Test be FAILED and Integration-Test SUCCESS, then the currentBuild.result will stay FAILED (it can only get worse)
    stage 'Code Analysis'
    build 'Analysis'
}
22
michaelbahr