Get access to Build Changelog in Jenkins
Asked Answered
S

6

39

I've been pulling my hair out trying to find a way to include the list of changes generated by Jenkins (from the SVN pull) into our Testflight notes. I'm using the Testflight Plugin, which has a field for notes - but there doesn't seem to be any paramater/token that jenkins creates to embed that information.

Has anyone had any luck accomplishing something like this?

Sift answered 6/8, 2012 at 7:4 Comment(1)
I needed the exact same thing. Thank you for asking this question, and I'm even more grateful for the answer.Skelton
E
35

It looks like the TestFlight Plugin expands variables placed into the "Build Notes" field, so the question is: how can we get the changes for the current build into an environment variable?

As far as I'm aware, the Subversion plugin doesn't provide this information via an environment variable. However, all Jenkins SCM plugins integrate changelog information, as you can see via the "Changes" link in the web UI for each build.

This information is also available via the Jenkins API, even while a build is in progress.

For example, if you add an "Execute shell" build step where you run this command:

curl -s "http://jenkins/job/my-job/$BUILD_NUMBER/api/xml?wrapper=changes&xpath=//changeSet//comment"

You'll get an XML document similar to this:

<changes>
  <comment>First commit.</comment>
  <comment>Second commit.</comment>
</changes>

You can then format this information however you like and place it into an environment variable which can then be referenced in the TestFlight "Build Notes" section.

However, setting an environment variable in a build step isn't persistent by default — to do so requires using the EnvInject Plugin.

In this case, you could write your changelog text to a temporary file with contents like:

CHANGELOG="New in this build:\n- First commit.\n- Second commit."

Then, by using a build step with the Environment Properties File Path option to load this file, the $CHANGELOG variable would exist in your environment and persist until the end of the build, allowing you to use it in the "Build Notes" field.


Note: I haven't used the TestFlight plugin myself (though I took a quick look at the code), and I only tested the changes API with a Git repository. Similarly, I didn't test how newlines should be encoded with the EnvInject plugin, so that could cause issues.

Ethnology answered 7/8, 2012 at 0:12 Comment(8)
Thank you so much, Christopher!Sift
BTW, "you can then format this information however you like" -- I used: sed -e "s/<\/*comment>//g" | sed '/^$/d;G' to strip out the XML <comment> tags and clean up the newlines.Skelton
To get a clean output of multiple change messages, I used this variation on @makdad's: sed -e "s/<\/comment>//g; s/<comment>/\t* /g; s/<\/*changes>//g" | sed '/^$/d;G'Gust
how to save this log into local variable?Alessi
Surely there must a simpler way to access this information without this workaround by now?Caron
This works for me, with one problem. If I execute this code: CHANGELOG=$(curl "http://localhost:8080/job/myproject/$UPSTREAM_BUILD_NUMBER/api/xml?wrapper=changes&xpath=//changeSet//comment" | sed -e "s/<\/comment>//g; s/<comment>/* /g; s/<\/*changes>//g" | sed '/^$/d;G') echo $CHANGELOG The $CHANGELOG contains a list of all the files and folders in the current folder AND the changelog. How do the files/folders from the current folder show up in this variable??Lisp
There's a Jenkins plugin (unreleased) which does this now. See github.com/daniel-beck/changelog-environment-plugin and issues.jenkins-ci.org/browse/…Ethnology
@ChristopherOrr Has the plugin been published yet?Yoong
G
8

Given that Jenkins log changed format, I updated XML content from the original post. Also, since original TestFlight died, and the plugin is now obsolete, I am shoving the content into an HTML file for use with HockeyKit. It is really a text file WITH line breaks. Making sed insert line breaks is ..challenging, and the string looks very confusing (at least to me) at a first glance.

#for distribution in projects
Changelog=$(curl "${BUILD_URL}api/xml?wrapper=changes&xpath=//changeSet//item//msg" | sed -e "s/<\/msg>//g; s/<msg>/\\`echo -e '\r'`/g; s/<\/*changes>//g" )

# Write result to properties file
echo -e "$Changelog" > "${BuildDestinationPath}/"${BUILD_NUMBER}.html

Note Edit: BuildDestinationPath and Changelog are my local variables. Variables in caps are Jenkins environment variables and should exist on any instalation.

Gnostic answered 11/3, 2015 at 15:53 Comment(1)
curl part should be different for jenkins servers with authenticationVoguish
F
4

I am using this one found here: http://jenkins.361315.n4.nabble.com/Get-SVN-changes-td3511042.html

${CHANGES, showPaths=true}

Very simple and it works for SVN.

Fino answered 28/1, 2013 at 19:54 Comment(1)
This seems to be a feature of the email-ext plugin, so it would work for sending the changelog in an email, but not elsewhere.Ethnology
P
2

I made some python example which coverts xml to CHANGELOGS

note.xml should be

<changes>
      <msg>First commit.</msg>
      <msg>Second commit.</msg>
</changes>

actual python code is below

from xml.etree.ElementTree import parse
tree = parse("note.xml")
root = tree.getroot()
sentence = 'CHANGELOG =\"' 
cnt = 1
for element in root.findall('msg'):
    tempstring = element.text
    tempstring =str(cnt)+'. '+'\\n'.join(tempstring.splitlines())
    sentence =sentence +tempstring +'\\n'
    cnt = cnt +1
sentence = sentence + '\"'
print sentence
Pitzer answered 21/10, 2014 at 5:56 Comment(0)
G
2

In fact, you can access to that information before the build phase finish by reading/parsing the ../builds/$BUILD_NUMBER/changelog.xml file inside the build folder. This file is created with the SVN/GIT commit triggering and not with the end of the build or post_build phase. That means, you can parse it at the start of the build phase of the same job with a script and insert the data in env variables.

This is if you don´t want to use the curl and XML.

Gulfweed answered 28/1, 2016 at 14:33 Comment(0)
A
0

The Testflight Plugin has an option for this. Here's the commit:

https://github.com/jenkinsci/testflight-plugin/commit/e8edfef012d4bdefb95ee24818891a27ac920a36

I didn't see it in the most recent testflight-plugin release so I built the plugin from git and it has this option.

enter image description here

Apostolic answered 24/1, 2013 at 17:3 Comment(1)
This won't help you if the testflight runs as a downstream project.Cord

© 2022 - 2024 — McMap. All rights reserved.