Подтвердить что ты не робот

Как выполнять действия для неудачных сборок в файле Jenkinsfile

Есть ли способ выполнить очистку (или откат), если сбой сборки в Jenkinsfile не удалось?

Я хотел бы сообщить нашему экземпляру Atlassian Stash, что сборка завершилась неудачно (выполнив curl по правильному URL-адресу).

В принципе, это будет пост-шаг, когда статус сборки установлен на сбой.

Должен ли я использовать try {} catch ()? Если да, какой тип исключения я должен уловить?

4b9b3361

Ответ 1

В настоящее время я также ищу решение этой проблемы. Пока лучшее, что я мог придумать, это создать функцию-оболочку, которая запускает код конвейера в блоке try catch. Если вы также хотите сообщить об успешном завершении, вы можете сохранить исключение в переменной и переместить код уведомления в блок finally. Также обратите внимание, что вам нужно повторно создать исключение, поэтому Дженкинс считает сборку неудачной. Возможно, какой-то читатель находит более элегантный подход к этой проблеме.

pipeline('linux') {
    stage 'Pull'
    stage 'Deploy'
    echo "Deploying"
    throw new FileNotFoundException("Nothing to pull")
    // ... 
}

 def pipeline(String label, Closure body) {
     node(label) {
        wrap([$class: 'TimestamperBuildWrapper']) {
            try {
                body.call()
            } catch (Exception e) {
                emailext subject: "${env.JOB_NAME} - Build # ${env.BUILD_NUMBER} - FAILURE (${e.message})!", to: "[email protected]",body: "..."
                throw e; // rethrow so the build is considered failed                        
            } 
        }
    }
}

Ответ 2

Начиная с 2017-02-03, Declarative Pipeline Syntax 1.0 можно использовать для достижения этой функциональности шага после сборки.

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

Вот пример файла Jenkins с декларативным синтаксисом:

pipeline {
  agent  label:'has-docker', dockerfile: true
  environment {
    GIT_COMMITTER_NAME = "jenkins"
    GIT_COMMITTER_EMAIL = "[email protected]"
  }
  stages {
    stage("Build") {
      steps {
        sh 'mvn clean install -Dmaven.test.failure.ignore=true'
      }
    }
    stage("Archive"){
      steps {
        archive "*/target/**/*"
        junit '*/target/surefire-reports/*.xml'
      }
    }
  }
  post {
    always {
      deleteDir()
    }
    success {
      mail to:"[email protected]", subject:"SUCCESS: ${currentBuild.fullDisplayName}", body: "Yay, we passed."
    }
    failure {
      mail to:"[email protected]", subject:"FAILURE: ${currentBuild.fullDisplayName}", body: "Boo, we failed."
    }
  }
}

Кодовый блок post - это то, что обрабатывает действие после шага

Ссылка на декларативный трубопровод Синтаксис здесь