Reading and parsing external XML file in a Jelly Template
I'm using Jenkins 1.410 and Email-Ext 2.14. My project is a sanity check to verify a number of other builds, ensuring that their ar开发者_StackOverflow中文版tifacts are being delivered properly and then to send out a summary email. That's all fine.
Now I'm trying to parse the parent project's POM.xml and extract a bunch of dependency versions, and include them in a nicely formatted section in the email.
The Question: How, in the Jelly template, can I read the external pom.xml (grab it as a collection/array of lines, xml dom object, big string, whatever) and extract the properties/attributes that I need. Given that, I can format them into a table, or something like that.
Do I need to create my own plugin (that'll be new for me)? Or does this functionality already exist?
Thanks a lot.
This functionality already exists in Email-ext plugin. You can read XML files from the Jelly script configured in that plugin using xml tag library: http://commons.apache.org/proper/commons-jelly/libs/xml/tags.html
Below is an example how to parse a pom.xml file located in the jenkins job workspace. Once file is read to {myxmldoc} it becomes a dom4j document which can be used with standard XPATH expressions to query or loop through needed attributes and elements:
<j:set var="WORK_SPACE" value="${buildenv.get('WORKSPACE')}"/>
<x:parse xml="${WORK_SPACE}/pom.xml" var="myxmldoc"/>
<!--select element with particular attribute-->
<x:set var="myvar" select="$myxmldoc/project/build/plugins/plugin[@attribute='abc']"/>
<!--Loop through elements-->
<x:forEach var="myloopvar" select="$myxmldoc/project/build/plugins/plugin">
.....
</x:forEach>
Pre-Steps
1. Download common-jelly package from: http://redrockdigimark.com/apachemirror/commons/jelly/binaries/commons-jelly-1.0.zip
2. Extract the files from the zip
3. Copy the following files: commons-jelly-tags-util-1.1.1.jar, commons-jelly-tags-xml-1.1.jar, commons-jelly-tags-fmt-1.0.jar
4. Paste the above files at: <Jenkins server path>\war\WEB-INF\lib
5. Restart Jenkins
XML IS: abc.xml
<sites>
<site>
<URL>http://www.google.com</URL>
<STATUS>200</STATUS>
</site>
<site>
<URL>http://www.yahoo.com</URL>
<STATUS>200</STATUS>
</site>
</sites>
Jelly Code to read above XML
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:x="jelly:xml" xmlns:html="jelly:html" xmlns:util="jelly:util">
<j:set var="xmlFilePath" value="${build.getWorkspace().child('abc.xml')}"/>
<util:file name="${xmlFilePath}" var="xmlFileContent" />
<x:parse var="myxmldoc" xml="${xmlFileContent}"/>
<x:set var="allSites" select="$myxmldoc/sites"/>
<table class="border">
<tr>
<th class="border1"><b>URL</b></th>
<th class="border1" width="140px"><b>HTTP Code</b></th>
<th class="border1" width="140px"><b>Status</b></th>
</tr>
<x:forEach var="mysite" select="$allSites/site">
<j:set var="myURL"><x:expr select='$mysite/URL' /></j:set>
<j:set var="myStatus"><x:expr select='$mysite/STATUS' /></j:set>
<tr>
<td class="border_test_passed">
<a href="${myURL}">${myURL}</a>
</td>
<td class="border_test_total">
<b>${myStatus}</b>
</td>
<td class="border_test_total">
<j:choose>
<j:when test="${myStatus=='200'}"><img src="${rooturl}userContent/BSGreen.png" width="15px" /></j:when>
<j:otherwise><img src="${rooturl}userContent/BSRed.png" width="15px" /></j:otherwise>
</j:choose>
</td>
</tr>
</x:forEach>
</table>
精彩评论