web-dev-qa-db-ja.com

Jenkinsパイプラインステージを、ジョブ全体を失敗させることなく失敗として表示する

これが私が遊んでいるコードです

node {
    stage 'build'
    echo 'build'

    stage 'tests'
    echo 'tests'

    stage 'end-to-end-tests'
    def e2e = build job:'end-to-end-tests', propagate: false
    result = e2e.result
    if (result.equals("SUCCESS")) {
        stage 'deploy'
        build 'deploy'
    } else {
        ?????? I want to just fail this stage
    }
}

「エンドツーエンドテスト」の段階を、ジョブ全体を失敗させることなく失敗としてマークする方法はありますか?伝播falseは常にステージをtrueとしてマークしますが、これは私が望んでいることではありませんが、Propagate trueはジョブを失敗としてマークします。

43
techgnosis

ステージはブロックを取得するため、try-catchでステージをラップします。ステージ内でtry-catchを実行すると成功します。

前述の新機能はより強力になります。その間:

try {
   stage('end-to-end-tests') {
     node {      
       def e2e = build job:'end-to-end-tests', propagate: false
       result = e2e.result
       if (result.equals("SUCCESS")) {
       } else {
          sh "exit 1" // this fails the stage
       }
     }
   }
} catch (e) {
   result = "FAIL" // make sure other exceptions are recorded as failure too
}

stage('deploy') {
   if (result.equals("SUCCESS")) {
      build 'deploy'
   } else {
      echo "Cannot deploy without successful build" // it is important to have a deploy stage even here for the current visualization
   }
}
21
vaza

JENKINS-26522 のような音。現在、できる最善のことは、全体的な結果を設定することです。

if (result.equals("SUCCESS")) {
    stage 'deploy'
    build 'deploy'
} else {
    currentBuild.result = e2e.result
    // but continue
}
13
Jesse Glick

私は最近、vazaの答えを使用しようとしました ジョブ全体を失敗させずにJenkinsパイプラインステージを失敗として表示する ジョブ名のような名前の独自のステージでジョブを実行する関数を記述するためのテンプレートとして驚いたことに動作しましたが、恐らくグルーヴィーな専門家がそれを見ているかもしれません:)

ジョブの1つが中止された場合の様子は次のとおりです。 enter image description here

def BuildJob(projectName) {
    try {
       stage(projectName) {
         node {      
           def e2e = build job:projectName, propagate: false
           result = e2e.result
           if (result.equals("SUCCESS")) {
           } else {
              error 'FAIL' //sh "exit 1" // this fails the stage
           }
         }
       }
    } catch (e) {
        currentBuild.result = 'UNSTABLE'
        result = "FAIL" // make sure other exceptions are recorded as failure too
    }
}

node {
    BuildJob('job1')
    BuildJob('job2')
}
11
grenix

これは、宣言的なパイプラインでも可能です。

pipeline {
    agent any
    stages {
        stage('1') {
            steps {
                sh 'exit 0'
            }
        }
        stage('2') {
            steps {
                catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                    sh "exit 1"
                }
            }
        }
        stage('3') {
            steps {
                sh 'exit 0'
            }
        }
    }
}

上記の例では、すべてのステージが実行され、パイプラインは成功しますが、ステージ2は失敗として表示されます。

Pipeline Example

ご想像のとおり、不安定またはその他のものにしたい場合は、buildResultstageResultを自由に選択できます。ビルドに失敗して、パイプラインの実行を継続することもできます。

これはかなり新しい機能なので、Jenkinsが最新であることを確認してください。

3
Erik B

ステージで「sh "not exist command"」などの明示的な失敗タスクを追加できます。

if (result.equals("SUCCESS")) {
   stage 'deploy'
   build 'deploy'
} else {
   try {
       sh "not exist command"
   }catch(e) {
   }
}
2
anyone.can.test

解決手順

  • エラーとしてマークするには、ステージでエラーを発行する必要があります
  • stageの範囲外で、例外を処理し、ビルドステータスを選択します
  • これにより、自分自身、@ user3768904、@ Sviatlanaを含む数人のユーザーが望む効果が得られます。

失敗したステップの成功例

node("node-name") {
  try {
    stage("Process") {
      error("This will fail")
    }
  } catch(Exception error) {
    currentBuild.result = 'SUCCESS'
    return
  }
  stage("Skipped") {
     // This stage will never run
  }
}

enter image description here

失敗して中断されたステップの例

node("node-name") {
  try {
    stage("Process") {
      error("This will fail")
    }
  } catch(Exception error) {
    currentBuild.result = 'ABORTED'
    return
  }
  stage("Skipped") {
     // This stage will never run
  }
}

enter image description here

1