Send parsed console output in email
A co-worker told me that every build in Jenkins has "actions" associated with it and that Jenkins plugins do their magic via actions. I was able to find all actions of my actions with build.getActions()
. I then looped through the actions until I got LogParserAction
which is the action supplied by the Jenkins Log Parser plugin.
I then looked through the source code of LogParserAction.class
to find the method getErrorLinksFile()
. With this method I was able to get the text of the parsed log. A similar method called getWarningLinksFile()
is available for the warnings and another is available for info.
I then looped through the text on \n
character and applied some regexs to make it look how I wanted. Important parts of the code are below. Looks better if you view it as HTML in 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>
ubiquibacon
ubiq·ui·ba·con - a side of a pig cured and smoked existing or being everywhere at the same time.
Updated on June 09, 2022Comments
-
ubiquibacon almost 2 years
I am working with two Jenkins plugins, Email-Ext and Log Parser. I have the regular expressions for the Log Parser plugin how I want them, and I would like to include the output of the Log Parser plugin in the email that is sent out to users after a build.
The Email-Ext plugin has access to the console output, and I could rewrite my regular expressions for the console output in the email, but since the Log Parser plugin has already done the hard work I was hoping there was some way I could just pull its output into the email.
Does anyone know of any way (like a Jenkins environment variable) this can be done?
-
Dave Newton over 12 yearsSee this gist for ideas on using more canonical Groovy code; it's untested but pretty close. Just seems a shame to write Groovy like that :(
-
Strinder about 8 yearsIs it with Email-Ext also possible to inline the logs? Couldn't find this at documentation? Perhaps somehow via scripting?
-
Strinder about 8 yearsFound the solution: Just add <pre>${BUILD_LOG, maxLines=9999, escapeHtml=false}</pre> to content area