У меня есть задание Дженкинса, настроенное на ежечасное выполнение. Я хочу, чтобы сообщение об успешной сборке отправлялось по электронной почте только один раз в день. Email-Ext дает мне возможность отправлять электронные письма обо всех успехах, неудачах и т. Д. Но что я хотел, так это возможность отправить успешное электронное письмо только один раз.
Дженкинс: отправка успешного электронного письма только один раз в день (хотя задание выполняется @hourly)
Ответы (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 для отправки результата для каждой сборки, а не только для неудачных сборок.
Что ж, не существует плагина, который мог бы сделать это за вас. Функция электронной почты по умолчанию в Jenkins очень проста и отлично работает. Однако существует плагин Email-ext, и он может делать намного больше для вас.
Прежде всего, с помощью Email-ext вы можете настроить конкретный триггер для отправки уведомления по электронной почте - это может быть успех или сбой, что аналогично поведению по умолчанию. Дженкинса. Но затем у вас есть более совершенный вариант, например Первая ошибка и Все еще не удается. Это даст вам большой контроль над тем, когда и кому (список получателей, коммитер или запрашивающий) ваш Jenkins отправит электронное письмо. В моем случае хорошая конфигурация здесь очень поможет с почтовым трафиком, генерируемым Jenkins. И вы можете отправлять определенные электронные письма в конкретной ситуации определенному списку людей - отлично!
Другой вариант, если вам действительно не нужен такой уровень контроля и вы хотите просто ограничить трафик электронной почты одной сводкой в день, - это настроить список рассылки. Большинство механизмов списков рассылки позволяют отправлять ежедневный дайджест всего почтового трафика в этот список. Этого должно быть достаточно, хотя я действительно не думаю, что это действительно хороший вариант в долгосрочной перспективе. Я бы определенно попробовал плагин Email-ext.
Как насчет подавления электронных писем, если с момента предыдущего электронного письма прошло недостаточно времени? Хотя это не совсем то, что было запрошено, сценарий предварительной отправки, подобный этому, может быть стоит рассмотреть из-за своей простоты?
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.
}
}