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

введите описание изображения здесь

Другие вопросы по тегам