下面是我的擴展電子郵件發佈詹金斯插件預發送Groovy腳本。希望您能夠根據您的需求進行調整。
它是專爲解析Serenity-JUnit XML文件而設計的,但很少費力地解析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等)。在這裏,我只是在改變這個話題。
的結果是這樣的:
健康檢查:OK - 傳遞4/4,0失敗,錯誤0,跳過0