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

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

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

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


person ubiquibacon    schedule 03.01.2012    source источник


Ответы (2)


Коллега сказал мне, что с каждой сборкой в ​​Jenkins связаны «действия», и что плагины Jenkins творят чудеса с помощью действий. Я смог найти все действия моих действий с 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>
person ubiquibacon    schedule 05.01.2012
comment
См. эту суть, чтобы узнать об использовании более канонического кода Groovy; это не проверено, но довольно близко. Просто стыдно так писать Groovy :( - person Dave Newton; 05.01.2012

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

person Amey    schedule 04.01.2012
comment
Можно ли с помощью Email-Ext также встроить журналы? Не удалось найти это в документации? Возможно как-то через скрипты? - person Strinder; 08.04.2016
comment
Решение найдено: просто добавьте ‹pre›${BUILD_LOG, maxLines=9999, escapeHtml=false}‹/pre› в область содержимого. - person Strinder; 08.04.2016