Как отправлять уведомления в трубопровод Дженкинса при восстановлении сборки?

Я хочу отправлять уведомления из моей сборки Jenkins, когда работа восстанавливается. Значение, когда текущая сборка выполнена успешно, и последняя сборка была ошибочной (неудачной, прерванной и т.д.).

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

Я пробовал "currentBuild.rawBuild.getPreviousBuild()?. getResult()", но получил исключение "org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: скрипты не разрешены для использования метода org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper getRawBuild". Если я выключу песочницу, это сработает. Возможно ли это с помощью песочницы?

Ответ 1

Интересный вопрос. Вы можете сделать это в декларативном конвейере Дженкинса, используя "измененную" часть столбца {}. Но вам нужно будет установить currentBuild.result для УСПЕХА или НЕИСПРАВНОСТИ в задании и проверить его в разделе сообщений. Кажется, что нет простого способа получить текущий статус сборки (сбой, успех и т.д.), Насколько это касается Дженкинса, не отслеживая его в вашем конвейере - если я не пропустил что-то тонкое. Вот пример, вы должны отправить уведомление в измененном разделе, где он проверяет значение SUCCESS:

pipeline {
    agent any

    parameters {
        string(name: 'FAIL',     defaultValue: 'false', description: 'Whether to fail')
    }

    stages {
        stage('Test') {

            steps {

                script {

                    if(params.FAIL == 'true') {
                        echo "This build will fail"
                        currentBuild.result = 'FAILURE'
                        error("Build has failed")
                    }
                    else {
                        echo "This build is a success"
                        currentBuild.result = 'SUCCESS'
                    }

                }
            }
        }
    }

    post {
        always  {
            echo "Build completed. currentBuild.result = ${currentBuild.result}"
        }

        changed {
            echo 'Build result changed'

            script {
                if(currentBuild.result == 'SUCCESS') {
                    echo 'Build has changed to SUCCESS status'
                }
            }
        }

        failure {
            echo 'Build failed'
        }

        success {
            echo 'Build was a success'
        }
        unstable {
            echo 'Build has gone unstable'
        }
    }
}

- Билл

Ответ 2

Я нашел еще одно рабочее решение, которое не требует, чтобы вы вручную отслеживали результат сборки. Хотя для этого требуется использовать элемент script: (

pipeline {
  agent any
  post {
    success {
      script {
        if (currentBuild.getPreviousBuild() && 
            currentBuild.getPreviousBuild().getResult().toString() != "SUCCESS") {
          echo 'Build is back to normal!'
        }
      }
    }
  }
}

Ответ 3

похож на ответ от @Kolky, это будет фрагмент для "сценария сценария", где вы используете "node {stage1... stage2... и т.д.}":

    stage('Email') {
        if (currentBuild.getPreviousBuild().getResult().toString() != "SUCCESS") {
            echo 'Build is back to normal!'
            stage('Send build recovered email') {
                mail body: 'My build back to successful',
//                    from: '', replyTo: '',
                        subject: 'My build back to successful',
                        to: '[email protected]'
            }

        }
    }

Ответ 4

В качестве альтернативы вы можете переместить логику script за пределы конвейера (в идеале - для Jenkins общая библиотека конвейеров для повторного использования и сохранить чистоту трубопровода), поэтому вам не понадобится блок script:

def sendNotification(buildStatus) {
  if (buildStatus != 'SUCCESS') {
    // Do nothing - only interested when status becomes GREEN
    return
  }

  mattermostSend "${env.JOB_NAME} has recovered! (<${env.BUILD_URL}|See the build>)"
}

pipeline {
  ...

  post {
    changed {
      sendNotification(currentBuild.currentResult)
    }
  }
}