Jenkinsパイプライン - 特定のステージとそれに続く条件付きステップでのトライキャッチ

私は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コードをスクリプトステップでラップする必要があります)。

解説 (0)