Jenkins: отправка электронной почты на основе выходных данных скрипта
У меня есть среда автоматизации тестирования, и тестовые прогоны проводятся через Jenkins. После завершения теста он генерирует несколько пользовательских отчетов в виде файла HTML. В отчете у меня есть таблица с общим количеством ошибок в качестве одного из столбцов. Я в основном хочу проанализировать этот HTML-файл и отправить электронное письмо в список рассылки, если ошибка больше 0.
Вот что я делал до сих пор на работе Дженкинса:
а. Настроил задание для запуска тестов [это в опции execute shell и запуске моего jar, так как инфраструктура тестирования является java-приложением]
б. У меня есть действие после сборки, в котором я выполняю код Python, который делает следующее:
Шаг 1. Получить последний HTML-отчет.
Шаг 2. Разбор этого файла.
Шаг 3. Если ошибка> 0:
тогда email_flag = true
еще:
email_flag = false.
Есть ли способ, с помощью которого я могу использовать вышеуказанные флаги и отправлять уведомления по электронной почте через плагины Jenkins? Я просто хочу понять лучший способ сделать это. Любая помощь приветствуется.
PS Я провел дополнительное исследование и увидел, что в плагине Email-ext [ https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin] есть опция сценария предварительной отправки, но я просто не не знаю, как использовать это для запуска кода Python и обработки сообщений электронной почты.
2 ответа
Ниже мой плагин Extended Email Publisher Jenkins предварительно отправляет скрипт Groovy. Надеюсь, вы сможете настроить его в соответствии с вашими потребностями.
Он предназначен для анализа XML-файлов Serenity-JUnit, но без особых усилий может анализировать HTML. Будет искать любой файл в данной sourceDirPath
какой образец соответствия "SERENITY-JUNIT-*xml"
, Тогда будет file.readToString()
извлеките результаты теста из этого xmlString
и объединить эти результаты в переменные tests, passed, failures, errors, skipped
, Наконец, он будет составлять msgSubject
и добавить его к msg
сам.
Обратите внимание, что build
, logger
а также msg
объекты, доступные плагином. Вы не должны изменять назначать их и / или менять их имена.
Автор сценария:
import static groovy.io.FileType.FILES
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.parsers.DocumentBuilder
import org.w3c.dom.Document
import org.w3c.dom.NodeList
import org.w3c.dom.Node
import org.w3c.dom.Element
import org.xml.sax.InputSource
import java.io.StringReader
logger.println "------------------------------------------------------------------------------------------------"
logger.println "Parsing SERENITY-JUNIT XML files for results to update Editable Email Notification."
// determine if build is remote, list folder and files
def sourceDirPath
if(build.workspace.isRemote()){
channel = build.workspace.channel
logger.println "Using channel: " + channel
sourceDirPath = new FilePath(channel, build.workspace.toString() + "\\target\\site\\serenity\\")
} else {
sourceDirPath = new FilePath(new File(build.workspace.toString() + "\\target\\site\\serenity\\"))
}
logger.println "Source dir: " + sourceDirPath
def files = sourceDirPath.list("SERENITY-JUNIT-*xml")
logger.println "Found XML files: \n" + files
// initialize result variables
def tests = 0
def failures = 0
def errors = 0
def skipped = 0
def passed = 0
// parse files
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance()
files.each{
logger.println "Starting to parse file: " + it
channel = build.workspace.channel
def file = new FilePath(channel, it.getRemote())
def xmlString = file.readToString()
logger.println "Extracted XML:\n" + xmlString
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder()
Document doc = dBuilder.parse(new InputSource(new StringReader(xmlString)))
doc.getDocumentElement().normalize()
Element testsuiteNode = doc.getDocumentElement()
logger.println testsuiteNode
tests += Integer.parseInt(testsuiteNode.getAttribute("tests"))
failures += Integer.parseInt(testsuiteNode.getAttribute("failures"))
errors += Integer.parseInt(testsuiteNode.getAttribute("errors"))
skipped += Integer.parseInt(testsuiteNode.getAttribute("skipped"))
logger.println "Completed parsing file: " + it
}
// calculate passed tests amount
passed = tests - failures - errors - skipped
// aggregated results
logger.println "Aggregated results:"
logger.println "Tests: " + tests
logger.println "Passed: " + passed
logger.println "Failures: " + failures
logger.println "Errors: " + errors
logger.println "Skipped: " + skipped
// compose message subject
def msgSubject
if(tests == 4){
if(failures > 0 || errors > 0){
msgSubject = "FAILED - Passed ${passed}/${tests}, Failures ${failures}, Errors ${errors}, Skipped ${skipped}."
}else if(skipped > 0){
msgSubject = "OK (w/ skipped tests) - Passed ${passed}/${tests}, Failures ${failures}, Errors ${errors}, Skipped ${skipped}."
}else{
msgSubject = "OK - Passed ${passed}/${tests}, Failures ${failures}, Errors ${errors}, Skipped ${skipped}."
}
}else{
msgSubject = "FAILED - Not all tests or too many tests executed (${tests})."
}
// set message subject
msg.setSubject(msg.getSubject() + ": " + msgSubject)
logger.println "------------------------------------------------------------------------------------------------"
Конечно, вы можете динамически изменять любой элемент письма (Кому, От, MsgText и т. Д.). Здесь я только меняю тему.
Результат примерно такой:
Wellness Check: OK - пройдено 4/4, сбои 0, ошибки 0, пропущено 0.
Во время действия по сборке, т. Е. При выполнении тестов, когда вы знаете, что тест не выполняется в Java, сразу или после выполнения всех тестов, вы можете заставить java возвращать значение оболочке.
System.exit(0)
- успех
System.exit(1)
- отказ
Всякий раз, когда он не равен 0, задания jenkins по умолчанию помечаются как Failed.
Ты можешь использовать Email-ext
плагин для отправки электронного письма только при сбое задания, выбрав соответствующий триггер - Failure - Any