Jenkinsfile, отправьте электронное письмо, когда неудача или улучшение - PullRequest
0 голосов
/ 14 января 2020

Я хотел бы отправить электронное письмо в следующих ситуациях:

  • каждый раз, когда запуск не удался, и
  • каждый раз, когда запуск не прерывался и не прерывался, и последний не прерванный прогон не завершился с ошибкой (ie. игнорирование прерванных прогонов, состояние изменилось с сбоя на что-то другое).

Пока я знаю, что могу написать раздел сообщения с условием сбоя, как:

pipeline {
    […]
    post {
        failure {
            emailext(
                to: 'email@company.com',  // testing
                subject: "Status: ${currentBuild.result?:'SUCCESS'} - Job \'${env.JOB_NAME}:${env.BUILD_NUMBER}\'",
                body: """
                    <p>EXECUTED: Job <b>\'${env.JOB_NAME}:${env.BUILD_NUMBER}\'</b></p>
                    <p>View console output at "<a href="${env.BUILD_URL}"> ${env.JOB_NAME}:${env.BUILD_NUMBER}</a>"</p>"""
            )
        }
    }
}

, и это обрабатывает первую часть. Но ни одно из других условий, доступных в разделе post, кажется, не соответствует моим намерениям: единственные условия, которые учитывают прошлое, это changed, fixed и regression, но первое слишком обобщенно c, fixed требует, чтобы пробег был успешным (и я также хочу нестабильно), и regression явно идет в неправильном направлении.

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 14 января 2020

Я думаю, вам нужно переключиться с декларативного конвейера на скриптовый конвейер, чтобы делать то, что вы хотите.

Интересная ссылка: Сценарий Jenkins с конвейером или декларативный конвейер

Не забывайте, что вам не нужно переключать весь файл. Вы можете иметь блок скрипта в декларативном конвейере.

См. Пример 35 там: https://jenkins.io/doc/book/pipeline/syntax/

0 голосов
/ 14 января 2020

Полное решение, которое я написал, основываясь на ответе @Simon Martineau, читая учебник Groovy, ответ на devops.SE , ответ на SO и Документация по currentBuild выглядит следующим образом:

post {
    always {
        script {
            // see https://stackoverflow.com/a/59739297/42610 for details
            if (currentBuild.currentResult == 'ABORTED') {
                return
            }

            def previousBuild = currentBuild.previousBuild
            while(previousBuild != null && previousBuild.result == 'ABORTED') {
                echo "Skipping over an aborted build ${previousBuild.fullDisplayName}"
                previousBuild = previousBuild.previousBuild;
            }
            def isFailure = currentBuild.currentResult == 'FAILURE'
            def wasFailure = previousBuild.result == 'FAILURE'
            echo "Is: ${currentBuild.currentResult} (${isFailure})"
            echo "Was: ${previousBuild.result} (${wasFailure})"

            def status = null
            if (isFailure && !wasFailure) {
                status = 'New failure'
            } else if (isFailure) {
                status = 'Still failure'
            } else if (wasFailure) {
                status = 'Failure fixed'
            }

            if (status != null) {
                emailext(
                    to: 'email@company.com',
                    subject: "${status}: Job \'${env.JOB_NAME}:${env.BUILD_NUMBER}\'",
                    body: """
                        <p>EXECUTED: Job <b>\'${env.JOB_NAME}:${env.BUILD_NUMBER}\'</b></p>
                        <p>Status: <b>${status}</b> (currently: ${currentBuild.currentResult}, previously: ${previousBuild.result})</p>
                        <p>View console output at "<a href="${env.BUILD_URL}"> ${env.JOB_NAME}:${env.BUILD_NUMBER}</a>"</p>"""
                )
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...