web-dev-qa-db-ja.com

Jenkins Pipelineプラグインを使用してポストビルドステージを実装する方法

Jenkins チュートリアル 説明 パイプライン プラグインを読んだ後、プラグインはPost-Buildステップ。ただし、ドキュメントは特定の指示に関してかなり制限されています。

たとえば、私はどのように実装するのだろうか:

  • ビルドが成功した場合にのみ実行
  • ビルドが成功または不安定な場合にのみ実行
  • ビルド結果に関係なく実行
  • ビルドが成功した場合のみ実行する

    stage 'build'
    ... build
    ... tests
    stage 'post-build'
    ...
    

    (または-Dmaven.test.failure.ignore=falseMAVEN_OPTSに追加します)

  • ビルドが成功または不安定な場合にのみ実行します

    stage 'build'
    ... build
    try {
        ... tests
    } catch {
        ...
    }
    stage 'post-build'
    ...
    

    (または-Dmaven.test.failure.ignore=trueMAVEN_OPTSに追加します)

  • ビルド結果に関係なく実行する-try / catch / finallyを使用して実行できますか?

    try {
        stage 'build'
        ...
    } catch {
        ...
    } finally {
        stage 'post-build'
        ...
    }
    

(いくつかの段階、つまり 'build')がベースとして設定に失敗したにもかかわらず、最終ビルドステータスがSUCCESSに設定されていることに気付きました最終段階で。つまり、最終ビルドステータスを明示的に設定する必要があります。つまり、currentBuild.result = 'UNSTABLE'?)

46
luka5z

最良の方法は、パイプラインスクリプトでビルド後のアクションを使用することです。

失敗の処理
Declarative Pipelineは、そのpostセクションを介して、デフォルトで堅牢な障害処理をサポートします。パイプライン構文セクションでは、さまざまな事後条件の使用方法について詳しく説明しています。

Jenkinsfile(宣言的パイプライン)

pipeline {
    agent any
    stages {
        stage('Test') {
            steps {
                sh 'make check'
            }
        }
    }
    post {
        always {
            junit '**/target/*.xml'
        }
        failure {
            mail to: [email protected], subject: 'The Pipeline failed :('
        }
    }
}

ドキュメントは以下にあります https://jenkins.io/doc/book/pipeline/syntax/#post

36

Try/catchを使用していて、ビルドを不安定または失敗としてマークする場合は、currentBuild.result = 'UNSTABLE'などを使用する必要があります。 junitの結果をテストします。ただし、ほとんどの場合、エラーをキャッチする場合は自己設定する必要があります。

続行したくない場合の2番目のオプションは、エラーを再スローすることです。

stage 'build'
... build
try {
    ... tests
} catch(err) {
    //do something then re-throw error if needed.
    throw(err)
}
stage 'post-build'
...
4
DanielD

FWIW、宣言されていないスクリプトパイプラインを使用している場合、他の回答で提案されているtry/catch/finallyブロックを使用する必要があります。 finallyブロックで、宣言型パイプラインの機能を模倣する場合は、ブロックに直接以下を配置するか、それを関数にしてfinallyブロックからその関数を呼び出すことができます。

def currResult = currentBuild.result ?: 'SUCCESS'
def prevResult = currentBuild.previousBuild?.result ?: 'NOT_BUILT'

// Identify current result
boolean isAborted = (currResult == 'ABORTED')
boolean isFailure = (currResult == 'FAILURE')
boolean isSuccess = (currResult == 'SUCCESS')
boolean isUnstable = (currResult == 'UNSTABLE')

boolean isChanged = (currResult != prevResult)
boolean isFixed = isChanged && isSuccess && (prevResult != 'ABORTED') && (prevResult != 'NOT_BUILT')
boolean isRegression = isChanged && currentBuild.resultIsWorseOrEqualTo(prevResult)

onAlways()
if (isChanged) {
    onChanged()
    if (isFixed) {
        onFixed()
    } else if (isRegression) {
        onRegression()
    }
}
if (isSuccess) {
    onSuccess()
} else {
    if (isAborted) {
        onAborted()
    }
    onUnsuccessful()
    if (isFailure) {
        onFailure()
    }
    if (isUnstable) {
        onUnstable()
    }
}
onCleanup()

さまざまなonXYZ()呼び出しは、宣言postブロックのより良い構文を使用する代わりに、その特定の条件を処理するために定義する関数です。

1
Will

try-catchブロックは、実際のアプリケーションコードのようにエラーを処理するように設定できます。

例えば:

try {
    node {
        sh 'sleep 20' // <<- can abort here
    }
} catch (Exception e) {
    println 'catch'
} finally {
    println 'finally'
}

node {
    println 'second'
}

try {
    node {
        sh 'sleep 20' // <<- can abort here again
    }
} catch (Exception e) {
    println 'catch'
} finally {
    println 'finally'
}

次に、2つのアボートを伴う出力例を示します。

Started by user me
Replayed #3
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] sh
[my-job] Running Shell script
+ sleep 20

Aborted by me

Sending interrupt signal to process

/var/lib/jenkins-slave/workspace/my-job@tmp/durable-9e1a15e6/script.sh: line 2: 10411 Terminated              sleep 20
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
catch
[Pipeline] echo
finally
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] echo
second
[Pipeline] }
[Pipeline] // node
[Pipeline] node
Running on my-node in /var/lib/jenkins-slave/workspace/my-job
[Pipeline] {
[Pipeline] sh
[my-job] Running Shell script
+ sleep 20

Aborted by me

Sending interrupt signal to process
/var/lib/jenkins-slave/workspace/my-job@tmp/durable-d711100c/script.sh: line 2: 10416 Terminated              sleep 20
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
catch
[Pipeline] echo
finally
[Pipeline] End of Pipeline
Finished: ABORTED

もちろん、これは実行中に発生する例外に対して機能します。

1
allprog