Installs and configures Jenkins CI server & node slaves. Resource providers to support automation via jenkins-cli, including job create/update.
- Chef version 0.9.10 or higher
-
'default' - Server installation - currently supports Red Hat/CentOS 5.x and Ubuntu 8.x/9.x/10.x
-
'node_ssh' - Any platform that is running sshd.
-
'node_jnlp' - Unix platforms. (depends on runit recipe)
-
'node_windows' - Windows platforms only. Depends on .NET Framework, which can be installed with the windows::dotnetfx recipe.
The default
recipe has the following cookbook pre-requisites:
- apt cookbook from Opscode for Debian/Ubuntu platforms or the fnichol github fork which has chef-solo support
- java cookbook from Opscode, the windows::java recipe from the dougm github repo, or manually installing Java 1.5 or higher
The jenkins::node_jnlp
recipe has an additional requirement on:
- runit cookbook from Opscode
The jenkins::node_windows
recipe has an additional requirement on:
- windows::dotnetfx recipe from the dougm github repo
Jenkins requires Java 1.5 or higher, which can be installed via the Opscode java cookbook or windows::java recipe.
If your Jenkins instance requires authentication, you'll either need to embed
user:pass in the server.url
or issue a jenkins-cli.jar login command
prior to using the jenkins::node_* recipes. For example, define a role like so:
name "jenkins_ssh_node"
description "cli login & register ssh slave with Jenkins"
run_list %w(vmw::jenkins_login jenkins::node_ssh)
Where the jenkins_login recipe is simply:
jenkins_cli "login --username #{node['jenkins']['username']} --password #{node['jenkins']['password']}"
Installs a Jenkins CI server using a native package where available. The
recipe also generates an ssh private key and stores the ssh public key in the
node pubkey
attribute for use by the node recipes.
Creates the user and group for the Jenkins slave to run as and sets
.ssh/authorized_keys
to the pubkey
attribute. The jenkins-cli.jar is
downloaded from the Jenkins server and used to manage the nodes via the
groovy cli command. Jenkins is configured to launch a slave agent on
the node using its SSH slave plugin.
Creates the user and group for the Jenkins slave to run as and '/jnlpJars/slave.jar' is downloaded from the Jenkins server. Depends on runit_service from the runit cookbook.
Creates the home directory for the node slave and sets 'JENKINS_HOME' and
'JENKINS_URL' system environment variables. The winsw Windows service
wrapper will be downloaded and installed, along with generating
jenkins-slave.xml
from a template. Jenkins is configured with the node as a
jnlp slave and '/jnlpJars/slave.jar' is downloaded from the Jenkins
server. The 'jenkinsslave' service will be started the first time the recipe is
run or if the service is not running. The 'jenkinsslave' service will be
restarted if '/jnlpJars/slave.jar' has changed. The end results is functionally
the same had you chosen the option to Let Jenkins control this slave as a
Windows service.
Uses the nginx::source recipe from the nginx cookbook to install an HTTP
frontend proxy. To automatically activate this recipe set the
node[:jenkins][:http_proxy][:variant]
to nginx
.
Uses the apache2 recipe from the apache2 cookbook to install an HTTP frontend
proxy. To automatically activate this recipe set the
node[:jenkins][:http_proxy][:variant]
to apache2
.
Base URL for downloading Jenkins (server)
Java install path, used for for cli commands
JENKINS_HOME directory
User the Jenkins server runs as
Jenkins user primary group
TCP listen port for the Jenkins server
Base URL of the Jenkins server
Download the latest version of plugins in this list, bypassing update center
Name of the node within Jenkins
Jenkins node description
Number of node executors
Home directory ("Remote FS root") of the node
Node labels
Node usage mode, "normal" or "exclusive" (tied jobs only)
Node launch method, "jnlp", "ssh" or "command"
"always" keeps node on-line, "demand" off-lines when idle
Number of minutes for which jobs must be waiting in the queue before attempting to launch this slave.
Number of minutes that this slave must remain idle before taking it off-line.
"Node Properties" -> "Environment Variables"
user the slave runs as
Hostname or IP Jenkins should connect to when launching an SSH slave
SSH slave port
SSH slave user name (only required if jenkins server and slave user is different)
SSH slave password (not required when server is installed via default recipe)
jenkins master defaults to: ~/.ssh/id_rsa
(created by the default recipe)
SSH slave JVM options
if iptables is enabled, add a rule passing 'jenkins[:server][:port]'
Use nginx
or apache2
to proxy traffic to jenkins backend (nil
by default)
Add a redirect rule for 'www.*' URL requests ("disable" by default)
List of HTTP ports for the HTTP proxy to listen on ([80] by default)
Primary vhost name for the HTTP proxy to respond to (node[:fqdn]
by default)
Optional list of other host aliases to respond to (empty by default)
Max client upload size ("1024m" by default, nginx only)
This resource can be used to execute the Jenkins cli from your recipes. For example, install plugins via update center and restart Jenkins:
%w(git URLSCM build-publisher).each do |plugin|
jenkins_cli "install-plugin #{plugin}"
jenkins_cli "safe-restart"
end
This resource can be used to configure nodes as the 'node_ssh' and 'node_windows' recipes do or "Launch slave via execution of command on the Master".
jenkins_node node[:fqdn] do
description "My node for things, stuff and whatnot"
executors 5
remote_fs "/var/jenkins"
launcher "command"
command "ssh -i my_key #{node[:fqdn]} java -jar #{remote_fs}/slave.jar"
env "ANT_HOME" => "/usr/local/ant", "M2_REPO" => "/dev/null"
end
This resource manages jenkins jobs, supporting the following actions:
:create, :update, :delete, :build, :disable, :enable
The 'create' and 'update' actions require a jenkins job config.xml. Example:
git_branch = 'master'
job_name = "sigar-#{branch}-#{node[:os]}-#{node[:kernel][:machine]}"
job_config = File.join(node[:jenkins][:node][:home], "#{job_name}-config.xml")
jenkins_job job_name do
action :nothing
config job_config
end
template job_config do
source "sigar-jenkins-config.xml"
variables :job_name => job_name, :branch => git_branch, :node => node[:fqdn]
notifies :update, resources(:jenkins_job => job_name), :immediately
notifies :build, resources(:jenkins_job => job_name), :immediately
end
The script to generate groovy that manages a node can be used standalone. For example:
% ruby manage_node.rb name slave-hostname remote_fs /home/jenkins ... | \
java -jar jenkins-cli.jar -s http://jenkins:8080/ groovy =
- CLI authentication - http://issues.jenkins-ci.org/browse/JENKINS-3796
- CLI *-node commands fail with "No argument is allowed: nameofslave" - http://issues.jenkins-ci.org/browse/JENKINS-5973
- Source hosted at GitHub
- Report issues/Questions/Feature requests on GitHub Issues
Pull requests are very welcome! Make sure your patches are well tested. Ideally create a topic branch for every seperate change you make.
This is a downstream fork of Doug MacEachern's Hudson cookbook (https://github.com/dougm/site-cookbooks) and therefore deserves all the glory.
Author:: Doug MacEachern ([email protected])
Contributor:: Fletcher Nichol [email protected]
Contributor:: Roman Kamyk [email protected]
Contributor:: Darko Fabijan [email protected]
Copyright:: 2010, VMware, Inc
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.