[This is not an April Fool’s joke. I always publish my posts on Tuesday mornings, and this week’s just happens to be a release announcement. I considered delaying for a day, but in the end, decided to keep up my regular posting schedule.]

At work, we’ve been migrating our build infrastructure from CruiseControl to Jenkins.

I’m mostly happy with the transition, but as we add more and more builds, using the Jenkins web interface to configure them gets tedious. The one main advantage that CruiseControl has is that it provides great tools for removing duplication from the build instructions.

With Jenkins, I haven’t found a good built-in way of managing the duplication between the various jobs. When we want to change a setting across all of our builds, we have to go through a tedious manual edit process with the web interface. It is possible to go under the hood and change the config.xml files, but this is also quite tedious.

More recently, I learned about Jenkins Job Builder (JJB), which is part of the infrastructure of the OpenStack project.

JJB allows us to specify our jobs in YAML and then run a command-line tool to update our Jenkins server with the new and/or modified job definitions. Having all of our jobs defined in one place in a clean format like YAML is an improvement, but still doesn’t directly deal with the duplication problem.

Fortunately, JJB has some abstraction capabilities that help to remove some of the duplication. The three main tools it provides are defaults, templates, and macros. Depending on your needs, these tools might be all you need to tame your Jenkins job definitions. For us, it was an improvement, but still not enough to support the different kinds of jobs we run. I spent some time thinking through some ways of improving JJB to meet our needs, but wasn’t able to come up with anything workable.

In the end, I decided to write a Ruby DSL as a front-end to JJB. That front-end is called Jujube and is available as a Ruby gem.

Jujube allows for even more abstraction capabilities than JJB itself, and I’ve found it able to solve all of the problems I had trying to remove duplication from my job definitions.

I consider Jujube’s API relatively stable at this point, but it is still incomplete. I’ve added support for the JJB components that I’ve needed up to this point, but that’s only a fraction of what JJB provides. I plan to add support for more components as I have time, and I’m more than open to requests for specific components to help me prioritize. I also welcome pull requests that add support for other components.

I am using Jujube to manage almost all of our Jenkins jobs in production today. The remaining jobs need some additional support in JJB before we can convert them to Jujube/JJB.

If you work with Jenkins, then I highly recommend looking at Jenkins Job Builder. It may be all you need to get your job definitions under control. If it isn’t quite enough, then take a look at Jujube and let me know how it works for you.