Дженкинс: отправка успешного электронного письма только один раз в день (хотя задание выполняется @hourly)

У меня есть задание Дженкинса, настроенное на ежечасное выполнение. Я хочу, чтобы сообщение об успешной сборке отправлялось по электронной почте только один раз в день. Email-Ext дает мне возможность отправлять электронные письма обо всех успехах, неудачах и т. Д. Но что я хотел, так это возможность отправить успешное электронное письмо только один раз.


person Rajesh    schedule 02.03.2013    source источник
comment
Вы хотите, чтобы электронное письмо отправлялось каждый день в определенное время? И следует ли отправлять это письмо только в том случае, если задание выполнено успешно или вам нужен статус задания?   -  person Shiva Kumar    schedule 02.03.2013
comment
Я хотел, чтобы электронное письмо отправлялось каждый день в определенное время и только в случае успеха.   -  person Rajesh    schedule 03.03.2013
comment
@Rajesh просто любопытно - как ты настроил его на ежечасную работу? Он использовал @hourly?   -  person streetlight    schedule 30.05.2014
comment
jenkins-ci.361315.n4.nabble.com/ Это похоже на решение для меня (хотя я не пробовал)   -  person Rajesh    schedule 08.09.2014
comment
Будет ли приемлемо отправлять электронное письмо только в случае неудачи? Электронной почты нет, предполагаю, что все в порядке.   -  person SnakeDoc    schedule 17.06.2015


Ответы (3)


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

В моем решении используется этап сборки Groovy в сочетании с функцией сценария предварительной отправки плагина Email-Ext. Я получил эту идею из Обсуждение темы, упомянутой в комментариях выше. См. Также рецепты Email-Ext на сайте Jenkins.

Вот начальный Groovy-скрипт, который определяет, какие сборки завершились ошибкой, настроенный в Выполнить системный Groovy-скрипт. Вы можете сделать что-то подобное, чтобы определить, удалась ваша сборка или нет:

// List the names of jobs you want to ignore for this check
ignore = [ ]

// Find all failed and unstable jobs
failed = hudson.model.Hudson.instance.getView("All").items.findAll{ job ->
  job.getDisplayName() != "Daily Jenkins Job Nag" &&
  !ignore.contains(job.getDisplayName()) &&
  job.isBuildable() &&
  job.lastCompletedBuild &&
  (job.lastCompletedBuild.result == hudson.model.Result.FAILURE ||
   job.lastCompletedBuild.result == hudson.model.Result.UNSTABLE)
}

// Log the job names so the build results are legible
failed.each { job ->
  println(job.getDisplayName() +
          " " + job.lastCompletedBuild.result +
          " at build " + job.lastCompletedBuild.number +
          " (" + job.lastCompletedBuild.timestamp.format("yyyy-MM-dd'T'HH:mm ZZZZ") + ")");
}

// Return failure if there are any failed jobs
return failed.size 

Затем в разделе Редактируемое уведомление по электронной почте я установил плагин Email-Ext для уведомления о сбое. Я установил Тип содержимого на Обычный текст (текст / простой), оставил Содержимое по умолчанию пустым и установил следующее как Предварительно отправить скрипт:

failed = hudson.model.Hudson.instance.getView("All").items.findAll{ job ->
  job.getDisplayName() != "Daily Jenkins Job Nag" &&
  job.isBuildable() &&
  job.lastCompletedBuild &&
  (job.lastCompletedBuild.result == hudson.model.Result.FAILURE ||
   job.lastCompletedBuild.result == hudson.model.Result.UNSTABLE)
}

def output = StringBuilder.newInstance()

output << "<html>\n"
output << " <body>\n"
output << "<p>Jenkins reports the following failed jobs:</p>"
output << "  <ul>\n"

failed.each { job ->
  url = hudson.model.Hudson.instance.rootUrl + job.url + "/" + job.lastCompletedBuild.number + "/"
  output << "   <li>"
  output << "<a href=\"" + url  + "\">" + job.displayName + "</a>"
  output << " " + job.lastCompletedBuild.result 
  output << " at build " + job.lastCompletedBuild.number
  output << " (" + job.lastCompletedBuild.timestamp.format("yyyy-MM-dd'T'HH:mm ZZZZ") + ")"
  output << "</li>\n"
}

output << "  </ul>\n"
output << " </body>\n"
output << "</html>"

msg.setContent(output.toString(), "text/html")

Ключ в том, что у вас есть доступ к объекту msg, который является MimeMessage. Вы можете установить любое содержание сообщения MIME, какое захотите.

В этом случае я создаю список неудачных заданий, но в вашем случае это будет любое сообщение, которое вы хотите получать для своего ежедневного отчета об успехе. В зависимости от того, что вам нужно, вы можете настроить Email-Ext для отправки результата для каждой сборки, а не только для неудачных сборок.

person Ken Pronovici    schedule 17.06.2015

Что ж, не существует плагина, который мог бы сделать это за вас. Функция электронной почты по умолчанию в Jenkins очень проста и отлично работает. Однако существует плагин Email-ext, и он может делать намного больше для вас.

Прежде всего, с помощью Email-ext вы можете настроить конкретный триггер для отправки уведомления по электронной почте - это может быть успех или сбой, что аналогично поведению по умолчанию. Дженкинса. Но затем у вас есть более совершенный вариант, например Первая ошибка и Все еще не удается. Это даст вам большой контроль над тем, когда и кому (список получателей, коммитер или запрашивающий) ваш Jenkins отправит электронное письмо. В моем случае хорошая конфигурация здесь очень поможет с почтовым трафиком, генерируемым Jenkins. И вы можете отправлять определенные электронные письма в конкретной ситуации определенному списку людей - отлично!

Другой вариант, если вам действительно не нужен такой уровень контроля и вы хотите просто ограничить трафик электронной почты одной сводкой в ​​день, - это настроить список рассылки. Большинство механизмов списков рассылки позволяют отправлять ежедневный дайджест всего почтового трафика в этот список. Этого должно быть достаточно, хотя я действительно не думаю, что это действительно хороший вариант в долгосрочной перспективе. Я бы определенно попробовал плагин Email-ext.

person Łukasz Rżanek    schedule 02.03.2013
comment
дайджест электронной почты - хорошая идея, но мне кажется, что это обходной путь. В настоящее время я настроил 2 задания в своих дженкинсах - одно, которое запускается каждый час, а другое, которое запускается только в определенное время, так что оно отправляет только одно успешное электронное письмо. - person Rajesh; 03.03.2013
comment
Это всегда будет обходным решением. Посмотрим правде в глаза - такой функции нет. НО вы можете написать свой плагин, чтобы делать все, что вы хотите. Тем не менее, помимо обычных функций и расширенных функций плагина электронной почты, вы мало что можете сделать из коробки. - person Łukasz Rżanek; 03.03.2013

Как насчет подавления электронных писем, если с момента предыдущего электронного письма прошло недостаточно времени? Хотя это не совсем то, что было запрошено, сценарий предварительной отправки, подобный этому, может быть стоит рассмотреть из-за своей простоты?

if (build.result != hudson.model.Result.SUCCESS) {
    cancel = true;
}
else {
  try {
    long minEmailGap = 1000 * 60 * 60 * 16; // 16 hours in milliseconds

    File file = new File("/TimestampForMyJob.txt");

    if (file.exists() == false) {
      file.createNewFile();
    }
    else {
      long currentTime = (new Date()).getTime();

      if (file.lastModified() + minEmailGap > currentTime) {
        cancel = true;
      }
      else {
        file.setLastModified(currentTime);
      }
    }
  }
  catch(IOException e) {
    // We can't tell whether the e-mail should be sent out or not, so we do nothing
    // and it just gets sent anyway - probably the best we can do with this exception.
  }
}
person Antony    schedule 02.10.2015