How to Extract Build Info from Jenkins with Python

I work with continuous integration software as a part of my job. I use both Hudson and Jenkins in my role and occasionally need to interact with them programmatically. There are two Python packages you can use for this task:

The Python Jenkins package will work with both Hudson and Jenkins which JenkinsAPI only works with Jenkins. I usually use Python Jenkins because of this, although I have recently started looking to see which one works better with artifacts and I discovered that JenkinsAPI is actually better for that sort of thing. So you will need to evaluate both of these packages depending on what you need to do.


Install Python Jenkins

To follow along with the code examples in this article, you will need to install Python Jenkins. You can use pip for that:

pip install python-jenkins

Now that it's installed, let's give Python Jenkins a whirl!


Getting All the Jobs from Jenkins

One common task is needing to get a listing of all the jobs that are configured in your build system.

To get started, you need to login to your Jenkins server:

import jenkins

server = jenkins.Jenkins('http://server:port/', username='user', 
                         password='secret')

Now you have a Jenkins object that you can use to execute REST requests against your Jenkins CI server. The results that are returned are usually a Python dictionary or dictionary of dictionaries.

Here's an example getting all the jobs that are configured on your CI system:

import jenkins

server = jenkins.Jenkins('http://server:port/', username='user',
                         password='secret')

# Get all builds
jobs = server.get_all_jobs(folder_depth=None)
for job in jobs:
    print(job['fullname'])

This will loop through all the jobs that are configured in Jenkins and print out their job names.


Getting Job Information

Now that you know the names of the jobs on your Jenkins box, you can get more detailed information about each job.

Here's how:

import jenkins

server = jenkins.Jenkins('http://server:port/', username='user',
                         password='secret')

# Get information on specific build job
# This returns all the builds that are currently shown in 
# hudson for this job
info = server.get_job_info('job-name')

# Passed
print(info['lastCompletedBuild'])

# Unstable
print(info['lastUnstableBuild'])

# Failed
print(info['lastFailedBuild'])

The get_job_info() will give you a lot of information about the job, including all the currently saved builds. It is nice to be able to extract which builds have passed, failed or are unstable.


Getting Build Information

If you want to know how long a job takes to run, then you need to get down to the build level.

Let's find out how:

import jenkins

server = jenkins.Jenkins('http://server:port/', username='user',
                         password='secret')

info = server.get_job_info('job-name')

# Loop over builds
builds = info['builds']
for build in builds:
    for build in builds:
        print(server.get_build_info('job-name', 
                                    build['number']))    

To get build metadata, you need to call get_build_info(). This method takes in the job name and the build number and returns the metadata as a dictionary.


Wrapping Up

You can do a lot more with the Python Jenkins package. For example, you can use it to start a build job, create a new job or delete an old one as well as quite a few other things. Unfortunately, the documentation is pretty bare-bones, so you'll have to do a fair bit of experimentation to get it working the way you want.


Additional Reading

Copyright © 2024 Mouse Vs Python | Powered by Pythonlibrary