ошибка уведомления jenkins произошла на разных этапах при отправке почты в конвейере (ранее известном как рабочий процесс)

У меня есть конвейер с несколькими шагами, например:

stage 'dev - compile'
node('master') {
  //do something
}

stage 'test- compile'
node('master') {
    //do something
}

stage 'prod- compile'
node('master') {
    //do something
}

Я хочу отправить электронное письмо, если что-то пойдет не так в работе, как я могу отправить электронное письмо независимо от того, где возникла ошибка, что-то вроде:

try {
 /** 
  all the code above
  **/
 } catch(Exception e) { 
     mail the error
 } 

person Daniel Hernández    schedule 29.04.2016    source источник
comment
Возможный дубликат Использовать Jenkins 'Mailer' внутри рабочего процесса конвейера   -  person Wilfred Hughes    schedule 15.09.2016


Ответы (3)


Я думаю, что лучше использовать сборку jenkins в post section вместо использования try catch:

pipeline {
  agent any
    stages {
      stage('whatever') {
        steps {
          ...
        }
      }
    }
    post {
        always {
          step([$class: 'Mailer',
            notifyEveryUnstableBuild: true,
            recipients: "[email protected]",
            sendToIndividuals: true])
        }
      }
    }
  }
}
person Andi    schedule 19.05.2017
comment
Хороший улов! Хотел бы я понять, почему плагин Mailer не отображается более красиво в декларативном конвейере, а не в низкоуровневом mail(), который требует гораздо большей сборки. Вероятно, 95% пользователей довольны электронными письмами, сгенерированными плагином Mailer... - person Yeroc; 28.07.2017

Что я сделал, чтобы включить полезную информацию в мою почту о сбое:

try {
    stage 'checkout cvs'
    node('master') {
        /** CODE **/
    }

    stage 'compile'
    node('master') {
        /** CODE **/
    }

    stage 'test unit'
    node('master') {
        /** CODE **/
    }   

    stage 'package'
    node('master') {
        /** CODE **/
    }

    stage 'nexus publish'
    node('master') {
        /** CODE **/
    }

    stage 'Deploy to App Server'
    node('master') {
        /** CODE **/            
    }

} catch(e) {
    String error = "${e}";
    // Make the string with job info, example:
    // ${env.JOB_NAME}
    // ${env.BUILD_NUMBER} 
    // ${env.BUILD_URL}
    // and other variables in the code
    mail bcc: '',
         cc: '',
         charset: 'UTF-8',
         from: '',
         mimeType: 'text/html',
         replyTo: '',
         subject: "ERROR CI: Project name -> ${env.JOB_NAME}",
         to: "${mails_to_notify}",
         body: "<b>${pivote}</b><br>\n\nMensaje de error: ${error}\n\n<br>Projecto: ${env.JOB_NAME} <br>Build Number: ${env.BUILD_NUMBER} <br> URL de build: ${env.BUILD_URL}";
    error "${error}"
}
person Daniel Hernández    schedule 11.08.2016
comment
Это также отправит электронное письмо, когда вы прервете задание. - person Mariusz Jamro; 27.09.2016
comment
И это то, что я хочу, я имею в виду, если что-то выдает мне ошибку, поэтому сообщите об ошибке - person Daniel Hernández; 27.09.2016

Что ж, ваша идея абсолютно верна, вам просто нужно переместить mail после блока catch или использовать finally. Примеры (в псевдокоде):

try {
    //code
    email = 'success'
} catch(Exception e) { 
    // error handler: logging
    email = 'failure'
}
send email

Или тот же подход с использованием встроенного конвейера catchError:

result = 'failure'
catchError { // this catches all exceptions and set the build result
    //code
    result = 'success' // we will reach this point only if no exception was thrown
}
send result 

Или используя finally:

try {
    //code
} finally { 
    send email
}
person izzekil    schedule 29.04.2016
comment
Я думаю, что если я использую наконец, я всегда буду отправлять электронное письмо, я просто хочу уведомить, когда сборка не работает. Кроме того, я попробовал catchError { echo 'ERROR MY FRIEND'; } и я указал неправильный IP-адрес в GIT, и я не получил эхо "ERROR MY FRIEND" - person Daniel Hernández; 30.04.2016
comment
Я могу неправильно понять ваш вопрос. Если вы хотите отправлять электронную почту только при возникновении ошибки, исходный фрагмент кода подходит идеально. Что касается catchError, он не блокирует ведение журнала. - person izzekil; 30.04.2016
comment
Я попробую свой код, честно говоря, я не пробовал, я просто подумал, что это не работает. - person Daniel Hernández; 30.04.2016
comment
Я также отредактировал пример catchError, чтобы он мог сохранить результат сборки. - person izzekil; 30.04.2016
comment
Я не думаю, что исходный фрагмент кода будет работать, если вы не поместите все в этот блок try {...} catch. Мне также интересно, есть ли такое решение, как слушатель/ловушка сбоя работы. - person fayndee; 11.08.2016