How to report Jenkins results to Jazz build engine
we have currently the following setup:
- We are in the process of introducing RTC, but have so far only introduced the change management part.
- currently using SVN for SCM (potentially changing to RTC in future)
- Jenkins for continuous integration and build automation.
As Jenkins is established and working with SVN, and RTC SCM not yet used, I would like to get Jenkins to report the build results to RTC. All manuals and information I have read so far was focussing on using RTC SCM as SCM, and not anything else. This leads of course to using the RTC Jenkins plugin and not the SVN plugin (it is either or).
I have managed to set up RTC and Jenkins in a way that builds can be started from RTC and the results are reported. When starting the build in Jenkins however, RTC seems to not get any information on it. Is there any way to accomplish this by means of a setting, or is it required to create an ANT task to "manually" transfer all the information?
Thanks!
Accepted answer
I was not really happy with the fact that it is only possible to
- either use the RTC SCM configuration and get the information in Jenkins and RTC updated, independent on where you start the build,
- OR use other SCMs and only have information on both sides when you start the build from RTC, but not when starting from Jenkins
What I did is probably not the nicest thing ever, but it works to have the build status information on both sides, independent from where you start the build. I wrote an Ant script to update RTC. The script is executed after the actual build is finished to get the correct status.
I actually used a 2nd Jenkins job to do this because I did not figure out how to run an ant task as post-build-step, but I am sure it could also be done in this way
All it does is collect the status information and if the build was not triggered from RTC it posts the status and a link to Jenkins to RTC
So here we go:
-
Create an RTC build engine and definition (in the RTC configuration in Eclipse, see IBM help)
-
Install the RTC build toolkit on the Jenkins machine
- Install Ant on the Jenkins machine
- Store the content at the end of the post to a file on the Jenkins machine, e.g. to build.xml
-
Create a passwordFile according to this description: https://jazz.net/help-dev/clm/index.jsp?re=1&topic=/com.ibm.team.build.doc/topics/tcreatepasstxt.html&scope=null
- Create a new Jenkins job without SCM
-
Add an Ant build step with the following settings:
Set the "Ant build file" path to the file just created (build.xml)
Set the "Target" to
-lib C:\IBM\TeamConcertBuild\buildsystem\buildtoolkit all
-
Add a post-build step "Trigger parameterized build on other projects" to the job that is actually connected to RTC.
Set the project to build on the job name of the previously created job
Set "Trigger when build is" to "Complete" to always run the job
Add "Predefined parameters" and set to the following to hand over the parameters to the other job
rtcRepositoryAddress=https://<your_RTC_server>/ccm rtcBuildDefinitionId=<build definition name> rtcBuildEngineId=<build engine name> jenkinsJobBuildURL=${BUILD_URL} jenkinsJobDisplayName=${BUILD_DISPLAY_NAME} buildResultUUID=${buildResultUUID}
----------
content of the build.xml file:
NOTE: I did not manage to get the content in here without being messed up. I hope it is fairly clear though. Specifically the <br=""> tags do not belong into the file, but they are somehow generated by the forum when posting...
<project name="postResultsToRTC"> <description> Ant script to post Jenkins build results to IBM CLM Parameters to be set for the Ant call -lib C:\IBM\TeamConcertBuild\buildsystem\buildtoolkit all Further parameters to be set (in Jenkins or via -Dxxx in the Ant call) rtcRepositoryAddress rtcBuildDefinitionId rtcBuildEngineId jenkinsJobBuildURL - build URL of job to report to ALM jenkinsJobDisplayName - displayed name in ALM buildResultUUID - buildResultUUID (set in original job) </description>
<import file="C:\IBM\TeamConcertBuild\buildsystem\buildtoolkit\BuildToolkitTaskDefs.xml" /> <!-- set global properties for this build --> <property name="userId" value="TODO: Add user name" />
<property name="thisBuildState" value="nothing" />
<property environment="env"/>
<!-- passwordFile is created according to following information:
https://jazz.net/help-dev/clm/index.jsp?re=1&topic=/com.ibm.team.build.doc/topics/tcreatepasstxt.html&scope=null -->
<property name="passwordFile" value="${env.JENKINS_HOME}\${userId}-password" />
<property name="tempFile" value="c:\temp\tempBuildState_${env.BUILD_ID}.json" />
<echo message="buildResultUUID: ${buildResultUUID}"/>
<!-- if buildResultUUID was already set, the build was started by IBM RTC (not by Jenkins)
and no information needs to be posted to RTC as this is done automatically -->
<condition property="runScript">
<length string="${buildResultUUID}" trim="true" length="0" />
</condition>
<!--
<echo if="${runScript}" message="Build was started from Jenkins, information is posted to IBM RTC"/>
<echo unless="${runScript}" message="Build was started from IBM RTC, no actions are performed. No information needs to be posted to RTC as this is done automatically"/>
-->
<target name="all" if="${runScript}" >
<echo message="Transferring build results of previous build to IBM CLM"/>
<echo message="Please note that this is a temporary solution and has several restrictions. Only a link to Jenkins will be published."/>
<echo message="Transferring data of the following job: ${jenkinsJobBuildURL}"/>
<echo message="...to the following RTC server:"/>
<echo message="RTC server address: ${rtcRepositoryAddress}"/>
<echo message="RTC build engine: ${rtcBuildEngineId}"/>
<echo message="RTC build definition: ${rtcBuildDefinitionId}"/>
<!-- Tell RTC that a build has started and get the buildResultUUID -->
<startTeamBuild buildDefinitionId="${rtcBuildDefinitionId}"
engineId="${rtcBuildEngineId}"
label="${jenkinsJobDisplayName}"
autoComplete="false"
resultUUIDProperty="newBuildResultUUID"
repositoryAddress="${rtcRepositoryAddress}"
userId="${userId}"
passwordFile="${passwordFile}"/>
<!-- publish a link in RTC to the build in Jenkins -->
<linkPublisher buildResultUUID="${newBuildResultUUID}"
verbose="true"
label="${jenkinsJobDisplayName}"
url="${jenkinsJobBuildURL}"
repositoryAddress="${rtcRepositoryAddress}"
userId="${userId}"
passwordFile="${passwordFile}" />
<!-- Get Jenkins status of current build. Use API Token for access
(in Jenkins click on your name in the top right corner and go to settings) -->
<get src="${jenkinsJobBuildURL}api/json"
dest="${tempFile}"
username="${userId}"
password="<TODO: Add the users Jenkins API Token, not the password itself>" />
<script language="javascript">
<![CDATA[
load('nashorn:mozilla_compat.js')
importClass(java.io.File);
importClass(java.io.FileReader);
importClass(java.io.BufferedReader);
importClass(java.io.FileWriter);
importClass(java.io.BufferedWriter);
var file = new File(postResultsToRTC.getProperty("tempFile"));
fr = new FileReader(file);
br = new BufferedReader(fr);
// Read the file.
// This assumes the file has no line breaks and is one line.
var json = br.readLine();
// Evaluate the JSON.
var struct = eval("(" + json + ")");
// Set each property in the project environment.
echo = postResultsToRTC.createTask("echo");
echo.setMessage(struct["result"]);
echo.perform();
// Map state as:
// - Jenkins status can be SUCCESS or FAILURE
// - IBM RTC status may be OK, ERROR or WARNING.
if (struct["result"] === "SUCCESS") {
postResultsToRTC.setProperty("thisBuildState","OK");
}
else {
postResultsToRTC.setProperty("thisBuildState","ERROR");
}
]]>
</script>
<!-- tell RTC that the build has finished -->
<completeTeamBuild status="${thisBuildState}"
buildResultUUID="${newBuildResultUUID}"
repositoryAddress="${rtcRepositoryAddress}"
userId="${userId}"
passwordFile="${passwordFile}"
verbose="true" />
<!-- remove temporary file -->
<delete file="${tempFile}"
quiet="true"/>
</target>
</project>
3 other answers
- the RTC SCM-plugin in Jenkins : here you link to RTC using the field "use a build definition for better RTC integration"
- a "Jenkins Build Definition" in RTC : here you can refer to your Jenkins-job
you should be able to launch and see the results on both sides. Jenkins will use the RTC Build Toolkit to perform the build.
Comments
This however will only work when selecting and configuring RTC as Source-Code-Management, right? (it is not sufficient to have the plugin installed)
As I am using SVN, this is not working. If I am getting it wrong, please let me know.
No.. you don't HAVE to use JAZZ SCM. its a checkbox on the build definition. just don't check it.
you can still use a Hudson/Jenkins build engine
@crisop that's right. When using Jenkins-SVN, you're not using the RTC Build Toolkit so there is no default feedback as RTC is not aware about what's happening in the SVN-build.
An idea without guarantee as I never tried it (but which should work) :
- create a RTC commandline-build where you define your SVN build steps instead of having your SVN-build in Jenkins.
This way you already move the build to RTC while still using SVN as the SCM.
Later, if you want to move your SCM to RTC, this will be interesting: https://jazz.net/help-dev/clm/index.jsp?re=1&topic=/com.ibm.team.scm.svn.doc/topics/c_intro.html&scope=null
you can have a build which is a commandline, and NO SCM integration. and the build result will still be pushed back to RTC. Yes it will not have any SCM content, but that wasn't the question.
@berndyman: this might work, however, it wouldn't be really nice, because I would lose the possibility to trigger the job based on a SVN commit. The job would have to run regularly without considering any SVN changes. It could only internally check if there were changes and omit further steps, but the job itself would always have to run...
@sdetweil: Sorry, but I don't get your point
All I was saying is that you can have a build, started by RTC, which has NO SCM integration, and its build result will still be recorded back in RTC.
on the prior comment, yes, this is a problem, using the uri to start the build job is not available if there is no connection between the triggering thing (svn commit) and the build definition.
I built a Deliver hook triggering extension for RTC, similar to the SVN/GIT commit hook, where it runs a script. But that wouldn't solve this problem as there is just no integration with SVN as the triggering system. you would have to clone and modify the GIT integration commit hook scripts, and probably some of the git server side plugin for RTC server.
Hi,
I have created a similar structure where I have integrated Gerrit with Jenkins and Jenkins with RTC and
with this once code review is performed in Gerrit, automatically build will trigger in Jenkins and in the job details upon clicking on RTC result option, it will take to RTC page where it will show the build result.
As Gerrit uses GIT as SCM, so I have used source code as GIT and I have created a build definition and build engine in RTC by selecting Jenkins option.
But for me the issue is I can see the build result from Jenkins to RTC and vice versa but it's showing as in progress. Manually I have to run once again build in RTC though it was successful in Jenkins.
Any Idea?
Regards,
Arun
Comments
What do you mean with similar structure? If you are using a similar ANT file as above, make sure to have
<completeTeamBuild .../>
at the end
Hi,
I am using Mavan. I have the same issue which has been posted earlier:
Unfortunately the results of Jenkins Initiated Builds will not be pushed back to RTC. This is as designed currently..
only builds initiated from RTC will be updated with the build results.
Regards,
Arun