Отправить разобранный вывод консоли по электронной почте

Я работаю с двумя плагинами Jenkins, Email-Ext и Log Parser. У меня есть регулярные выражения для плагина Log Parser, как я их хочу, и я хотел бы включить вывод плагина Log Parser в электронное письмо, отправленное пользователям после сборки.

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

Кто-нибудь знает какой-либо способ (например, переменную окружения Jenkins)? Это можно сделать?

Ответ 1

Сотрудник сказал мне, что у каждой сборки в Дженкинсе есть "действия", связанные с ней, и что плагины Дженкинса делают свою магию через действия. Я смог найти все действия своих действий с помощью build.getActions(). Затем я перебирал действия, пока не получил LogParserAction, который является действием, предоставляемым плагином Jenkins Log Parser.

Затем я просмотрел исходный код LogParserAction.class, чтобы найти метод getErrorLinksFile(). С помощью этого метода я смог получить текст анализируемого журнала. Аналогичный метод под названием getWarningLinksFile() доступен для предупреждений, а другой доступен для информации.

Затем я зациклился на тексте на символе \n и применил некоторые регулярные выражения, чтобы он выглядел так, как я хотел. Важные части кода приведены ниже. Выглядит лучше, если вы рассматриваете его как HTML в Notepad ++

%>
    <TABLE width="100%">
        <TR>
            <TD class="bg1" colspan="2">ERRORS</TD>
        </TR>
<%
    def publisher = null
    for(iter in project.getPublishersList()){
        if(iter.getDescriptor().getDisplayName().equals("Editable Email Notification")){
            publisher = iter
            break
        }
    }
    if(publisher != null){
        def logParserResult
        //Get the LogParserAction from Jenkins
        for(action in build.getActions()){
            if(action.toString().contains("LogParserAction")){
                //Get the LogParserResult from the LogParserAction
                logParserResult = action.getResult()
                break
            }
        }

        //Get the ErrorLinksFile from the LogParserResult
        def errorLinksFile = new File(logParserResult.getErrorLinksFile())

        //Rewrite the URL so it directs to something useful
        pattern = ~/<a.*?><font.*?>/
        def errorList = []
        for(line in errorLinksFile.getText().split("\n")){
            //All errors have a link, so this makes sure no superfluous text is displayed
            if(!line.contains("href")){
                continue
            }
            errorList.add(line.replaceAll(pattern, "<a href="+ rooturl + build.url + "parsed_console/?\">").minus("</font>"))
        }
%>
        <TR>
            <TD class="bg2" colspan="2">Total : ${errorList.count{it}} error(s)</TD>
        </TR>
<%
        for(error in errorList){
%>
        <TR>
            <TD class="errors" colspan="2">${error}</TD>
        </TR>
<%
        }
%>
    </TABLE>

Ответ 2

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