We're pretty avid testers here at Caktus and when one of our Django projects required upgrading to Python 2.7, we also needed to upgrade our Jenkins build environment. Luckily, Jenkins supports distributed builds to allow a master install to delegate tasks to slaves instances. This way we can continue to run our primary build system on Ubuntu 10.04, which defaults to Python 2.6, and delegate tasks to an Ubuntu 11.04 environment running Python 2.7. The setup is fairly easy, but since I didn't find much out there already, I figured I write up a quick post outlining what we did.
To start, we'll need a new machine. I setup an Ubuntu 11.04 instance on Linode. Then SSH in, upgrade the packages, and install a Java Runtime Environment:
$ sudo apt-get update $ sudo apt-get upgrade $ sudo apt-get install default-jre
That's the only package Jenkins needs by default. Next we'll setup a user for Jenkins to SSH as. To do this, we'll add a new user to the system and copy the master's SSH public key:
$ sudo useradd -m jenkins $ sudo -u jenkins mkdir /home/jenkins/.ssh $ sudo -u jenkins vim /home/jenkins/.ssh/authorized_keys2
Now the master Jenkins client can ssh to the slave without a password. Next we need to configure the Jenkins master to connect to the slave. Head over to the Master environment and navigate to "Manage Jenkins" and then "Manage Nodes". Click "New Node" in the sidebar and add a Dumb Slave. On the following page, fill in the following fields:
- # of executors: 2 (controls the number of concurrent builds)
- Remote FS root: /home/jenkins
- Labels: python27 natty
- Usage: Leave this machine for tied jobs only
- Launch method: Launch slave agents on Unix machines via SSH. Also fill in the Host field with the address of your slave machine.
Hit save and your Jenkins master should open a connection to your slave machine. To use the new slave machine, update an existing Jenkins job and set the "Restrict where this project can be run" Label Expression to "python27". You'll need to install any project dependencies on the slave for it to build properly, but that's basically it!