OpenStack can be used to provision Jenkins slaves on demand. A Jenkins slave is an executor node that runs a Jenkins agent and gets jobs from the Jenkins master.
To set up this integration a Jenkins plugin was used, called JClouds. Installing Jenkins plugins is a fairly straight forward job that can be done from the web interface through Manage Jenkins -> Manage Plugins. The JClouds plugin is designed to work with multiple cloud platforms, so it has to be configured for OpenStack specifically. The plugin configurations can be found under Manage Jenkins -> Configure System, or alternatively can also be tweaked from /var/lib/jenkins/config.xml. The parameters to configure are:
Profile : <profile name> Provider Name : openstack-nova End Point URL : http://<ip>:5000/v2.0/ Identity : tenant:user Credentials : <password> RSA Private Key : <private key> Public Key : <public key>
The endpoint should point to the machine where you have the openstack-nova-api set up. In case of our all-in-one type of setup, there is not much to choose from. The identity and credentials are needed for authentication at OpenStack. If you want to keep Jenkins slave separate from other projects running on OpenStack you can create a new tenant/user pair in OpenStack as such:
source keystonerc_admin keystone user-create --name=jenkins --pass=<pass> keystone tenant-create --name=jenkins-testbed --description="Jenkins Testbed" keystone user-role-add --user=jenkins --role=_member_ --tenant=jenkins-testbed
Next you should create a key pair that Jenkins will use to allow ssh access into the slaves.
Note! The public key of the created key pair should be uploaded into OpenStack, so that it can be injected in the VMs authorized_hosts list. Do this using:
nova keypair-add --pub-key <pub key> jenkins-key
You can test your setup with a Test Connection button on the bottom of the page.
In order to be able to start slaves, you first need to define Cloud Instance Templates. The parameters to configure are:
Name : <name> Labels : <lable1> <label2> Hardware Options Specify Hardware ID : RegionOne/2 (m1.small) Image/OS Options Specify Image ID : RegionOne/<image ID> General Options Admin Username : <admin username> Networks : <network ID> Security Groups : <secgroup> Open Stack Options Key Pair Name : jenkins-key
After naming the template you should also give it a couple of labels. Labels work in Jenkins like tags. It's useful to group more templates of the same kind, for example with 'slave' for generic templates, and with more specialized keywords for other templates. These labels can later be used in job configurations, and it's the main way of restricting the type of the node where a they are allowed to run.
Next a collection of openstack specific options continue. You should choose one of the provided Hardware type (m1.tiny, m1.small...) and image IDs. You can find image IDs by executing glance image-list in your openstack node. The 'Admin Username' expects the username with sudo capabilities on the image that you are about to boot. This varies from image to image (for example, the centOS 6 cloud image has 'root', while the centOS 7 image has 'centos'). This is required, because Jenkins will attempt to ssh into a newly created VM to set up its environment. The network ID has to be the ID of an already existing network within openstack, and can be viewd with nova network-list. (Note! This network should be associated with the same tenant that you created for the jenkins user) You can provide specific, already existing security groups to use, but we observed that Jenkins tends to create its own security group in OpenStack with a single rule that opens up port 22. Last, you have to provide the name of the keypair that you installed in the previous step, while setting up the connection. These options should be sufficient to start Jenkins slaves.
Other useful options that can be tweaked are:
Init Script : executes a series of bash commands after the VM is created Allow Sudo : Jenkins creates a UNIX user (named 'jenkins' by default) to run its agent. This enables sudo on it. Useful when you want to install something through the Init Script. Install Private Key : copy the private key provided in the setup, such that you can ssh from one slave into the other.