web-dev-qa-db-ja.com

Jenkinsパイプラインのどの段階が失敗したかをどのように知ることができますか

私のJenkinsパイプラインでは、通常、post宣言関数を使用して、パイプラインが失敗した場合にメールを送信します。

post関数の簡単な構文は次のとおりです。

post {
    failure {
        mail to: '[email protected]',
             subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
             body: "Something is wrong with ${env.BUILD_URL}"
    }
}

上記の電子メールでは、パイプラインのどのステージ(パイプラインに5〜6ステージがあるとしましょう)が失敗したかについても言及したいと思います。どうやってやるの?どんな助けも大歓迎です。

上記の要件に対する拡張機能は、失敗通知電子メールの一部として(失敗したステージの)実際のエラーログをユーザーに提供することです。

アイデアは、ユーザーがジェンキンスから障害通知を受け取ったときに、パイプラインのどの段階がエラーログとともに失敗したかを知る必要があるということです。

前もって感謝します。

12
Yash

使用できるenv.STAGE_NAMEという変数があります。ただし、postステージでenv.STAGE_NAMEを取得すると、結果はDeclarative: Post Actionsになるため、おそらく、ステージ名を別の変数に格納する必要があります。代わりに、すべてのステージの変数にステージ名を保存する必要があります。そのため、ステージが失敗すると、ジェンキンスは次のステージを続行しないため、「失敗した」ステージ名になります。

以下に例を示します。

def FAILED_STAGE

pipeline {
    agent { label "master" }
    stages {
        stage("Stage 1") {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    echo "stage 1"
                }
            }
        }
        stage("Stage 2") {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    echo "stage 2"
                    error "failed for some reason."
                }
            }
        }
        stage("Stage 3") {
            steps {
                script {
                    FAILED_STAGE=env.STAGE_NAME
                    echo "stage 3"
                }
            }
        }
    }
    post {
        failure {
            echo "Failed stage name: ${FAILED_STAGE}"
        }
    }
}

より良い方法があるかもしれませんが、私は今のところ見つけていません。

ログについて- JENKINS-40526 では、APIを使用してそこからログファイルを取得できますが、パイプライン内から必要なパラメーターを取得できるかどうかはわかりません。もう1つの解決策は、 emailext を使用して、ビルドログファイル全体を電子メールで送信することです。

emailext attachLog: true, body: '', compressLog: true, subject: 'Build failed.', to: '[email protected]'

10
tftd