Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Capture Jenkins Job Environment Variables in XL Release

DZone's Guide to

Capture Jenkins Job Environment Variables in XL Release

I’d like to share with you how you can use your Maven POM metadata (GAV Definition) and other environment variables in XL Release by propagating them through Jenkins.

· DevOps Zone
Free Resource

The Nexus Suite is uniquely architected for a DevOps native world and creates value early in the development pipeline, provides precise contextual controls at every phase, and accelerates DevOps innovation with automation you can trust. Read how in this ebook.

One of our most important goals here at XebiaLabs is to make sure our customers get the most out of their investments — not just with respect to our products, but also to other tools in the DevOps tool chain. Today, I’d like to share with you how you can effectively use your Maven POM metadata (GAV Definition) and other environment variables in XL Release by propagating them through Jenkins.

Currently, Jenkins task in XL Release only returns back BUILD NUMBER and BUILD STATUS as output properties that you can capture in variables. But what if you want to capture all the environment variables that are available in a build job including Maven POM Variables? Here’s how to do it.

Let’s first look at a Jenkins task inside XL Release.

5

Let’s now look at a detailed view of task.

6

Changes for Capturing Environment Variables

Let’s move on to the changes you’ll need to make in Jenkins to capture environment variables:

  • In your Jenkins instance, go to Manage Plugins and install the EnvInject Plugin.
  • Select a candidate job that you want to trigger using XL Release Jenkins task. In this case, we’re using a petclinic job that builds the sample spring-petclinic GitHub project, which is available online using Java and Maven.
  • After creating a new job, go to Configure Job and set up basic things like build commands, GitHub repo, and so on.
  • In the General section, check the option Prepare an environment for the run, then check the options for Keep Jenkins Environment Variables and Keep Jenkins Build Variables. These allow you to capture all the standard environment variables.
  • To capture the POM variables that in turn will allow you to capture the GAV Definition, do the following:
    • In Pre-Steps, add three steps in the following order (considering you’re running on Linux)
      1. Execute Shell: echo POM_VERSION=$POM_VERSION > mvn.props
      2. Inject Environment Variables (provide mvn.props as the value in Properties File Path property).
      3. Execute Shell rm mvn.props.
    • When you’re done with the above, save the job.

How to effectively use Maven POM metadata by propagating them through Jenkins

With the EnvInject Plugin, the XL Release task will be modified to access the environment variables through the expose REST API by this plugin.

Sample: http://localhost:8080/jenkins/job/petclinic/14/injectedEnvVars/api/json

Changes in XL Release

Next, we’ll make changes to XL Release. Here we’ll perform a type and script modification to add extra functionality to Jenkins task. To prepare for this, we first need to get the python script that’s currently executed as part of Jenkins task. Take the following steps:

  • Go to the box where XL Release is installed.
  • Go to XL Release Home folder and then inside lib folder.
  • Look for the server-****.jar file.
  • Now using either an unzip utility or the jar command, unzip to extract the following file: jenkins/Build.py sample jar command:  jar -xvf server-5.0.0.jar jenkins/Build.py
  • You’ll see a folder named Jenkins containing a Build.py, which is created in the lib folder.
  • Now make the changes outlined below.
    • Edit the XLR_HOME/ext/synthetic.xml and type the following:
        <type-modification type="jenkins.Build">
                 <property name="properties" category="output" kind="map_string_string" required="false" description="All environment properties"/>
        </type-modification>
    • Move the jenkins folder under XLR_HOME/ext/ such that it looks like XLR_HOME/ext/jenkins/Build.py
    • Edit that file and look out for this section:
        while True:
            # now we can track our builds
            time.sleep(poll_interval)
            response = request.get(jobContext + str(buildNumber) + '/api/json', contentType = 'application/json')
            buildStatus = JsonPathResult(response.response, 'result').get()
            duration = JsonPathResult(response.response, 'duration').get()
            if buildStatus and duration != 0:
                break 
    • Underneath this section, add the following lines (be careful of indentation as these lines are not inside the while loop but at the same level):
        envResponse = request.get(jobContext + '/' + str(buildNumber) + '/injectedEnvVars/api/json', contentType = 'application/json')
        properties = JsonPathResult(envResponse.response,'envMap').get()
    • Save Build.py. You have now overridden the Jenkins functionality to add a new field that’s of type string key-value map and will be populated by the environment variables from Jenkins.
    • Restart XL Release.

Testing Changes in the XL Release GUI

You’ll now notice that your previous Jenkins task shows another extra field in output properties:

How to effectively use Maven POM metadata by propagating them through Jenkins

Once the Jenkins job completes, you can run a release and look at the task:

How to effectively use Maven POM metadata by propagating them through Jenkins.

Using the Captured Values

To create a variable as a map full of values, you can specify the variable in the properties field. Let’s call that variable props.

  • To use the value in a script task or precondition, use it as follows: print releaseVariables['props']['POM_VERSION'] (where props is the map variable and POM_VERSION is the key whose value need to be captured).
  • To use the value in a manual task, email body, or anywhere else, you need to create a variable per value that you want to capture and then use a script task to set them with the right values. For detailed instructions see here

The DevOps Zone is brought to you in partnership with Sonatype Nexus.  See how the Nexus platform infuses precise open source component intelligence into the DevOps pipeline early, everywhere, and at scale. Read how in this ebook

Topics:
jenkins ,devops ,maven ,xl release

Published at DZone with permission of Amit Mohleji. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}