blob: 02c0f5908f68003cc6fb2bc1c919ec15b95e0c40 [file] [log] [blame] [view]
Michael Neale3e124ed2014-07-18 15:12:27 +10001# Official Jenkins Docker image
Michael Neale2dedbdb2014-07-09 16:58:10 +10002
Michael Nealefe683742014-09-26 20:49:30 +10003The Jenkins Continuous Integration and Delivery server.
Michael Neale711e12e2014-07-16 11:02:46 +10004
Michael Neale3e124ed2014-07-18 15:12:27 +10005This is a fully functional Jenkins server, based on the Long Term Support release
6http://jenkins-ci.org/
Michael Neale711e12e2014-07-16 11:02:46 +10007
Michael Neale71eb3ab2014-07-09 18:04:01 +10008
Michael Neale00190fb2014-07-18 15:17:18 +10009<img src="http://jenkins-ci.org/sites/default/files/jenkins_logo.png"/>
10
Michael Neale3e124ed2014-07-18 15:12:27 +100011
12# Usage
Michael Neale71eb3ab2014-07-09 18:04:01 +100013
14```
Carlos Sanchez67b0ff52015-07-02 12:13:49 +020015docker run -p 8080:8080 -p 50000:50000 jenkins
Michael Neale71eb3ab2014-07-09 18:04:01 +100016```
17
Michael Nealefe683742014-09-26 20:49:30 +100018This will store the workspace in /var/jenkins_home. All Jenkins data lives in there - including plugins and configuration.
19You will probably want to make that a persistent volume (recommended):
Michael Neale71eb3ab2014-07-09 18:04:01 +100020
21```
Carlos Sanchez67b0ff52015-07-02 12:13:49 +020022docker run -p 8080:8080 -p 50000:50000 -v /your/home:/var/jenkins_home jenkins
Michael Neale71eb3ab2014-07-09 18:04:01 +100023```
24
Carlos Sanchezc8c95d12015-07-02 12:36:13 +020025This will store the jenkins data in `/your/home` on the host.
26Ensure that `/your/home` is accessible by the jenkins user in container (jenkins user - uid 1000) or use `-u some_other_user` parameter with `docker run`.
Michael Nealefe683742014-09-26 20:49:30 +100027
28
29You can also use a volume container:
30
31```
Carlos Sanchez67b0ff52015-07-02 12:13:49 +020032docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home jenkins
Michael Nealefe683742014-09-26 20:49:30 +100033```
34
35Then myjenkins container has the volume (please do read about docker volume handling to find out more).
36
Michael Neale3e124ed2014-07-18 15:12:27 +100037## Backing up data
38
Michael Nealefe683742014-09-26 20:49:30 +100039If you bind mount in a volume - you can simply back up that directory
40(which is jenkins_home) at any time.
Michael Neale3e124ed2014-07-18 15:12:27 +100041
Michael Nealefe683742014-09-26 20:49:30 +100042This is highly recommended. Treat the jenkins_home directory as you would a database - in Docker you would generally put a database on a volume.
Michael Neale3e124ed2014-07-18 15:12:27 +100043
Carlos Sanchez40c86cd2015-07-15 19:16:11 +020044If your volume is inside a container - you can use ```docker cp $ID:/var/jenkins_home``` command to extract the data, or other options to find where the volume data is.
Michael Nealefe683742014-09-26 20:49:30 +100045Note that some symlinks on some OSes may be converted to copies (this can confuse jenkins with lastStableBuild links etc)
46
Carlos Sanchez40c86cd2015-07-15 19:16:11 +020047For more info check Docker docs section on [Managing data in containers](https://docs.docker.com/userguide/dockervolumes/)
48
Carlos Sanchezd6669532015-07-02 12:22:00 +020049# Setting the number of executors
50
51You can specify and set the number of executors of your Jenkins master instance using a groovy script. By default its set to 2 executors, but you can extend the image and change it to your desired number of executors :
52
53```
54# executors.groovy
55Jenkins.instance.setNumExecutors(5)
56```
57
58and `Dockerfile`
59
60```
61FROM jenkins
62COPY executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy
63```
64
65
Michael Nealefe683742014-09-26 20:49:30 +100066# Attaching build executors
Michael Neale3e124ed2014-07-18 15:12:27 +100067
rhels9aa88402015-06-01 17:12:25 -070068You can run builds on the master (out of the box) but if you want to attach build slave servers: make sure you map the port: ```-p 50000:50000``` - which will be used when you connect a slave agent.
Michael Neale3e124ed2014-07-18 15:12:27 +100069
Michael Neale2627b962014-07-21 15:52:23 +100070<a href="https://registry.hub.docker.com/u/maestrodev/build-agent/">Here</a> is an example docker container you can use as a build server with lots of good tools installed - which is well worth trying.
71
Nicolas De Loof28d0c592014-10-01 15:07:26 +020072# Passing JVM parameters
73
74You might need to customize the JVM running Jenkins, typically to pass system properties or tweak heap memory settings. Use JAVA_OPTS environment
75variable for this purpose :
76
77```
Carlos Sanchez67b0ff52015-07-02 12:13:49 +020078docker run --name myjenkins -p 8080:8080 -p 50000:50000 --env JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com jenkins
Nicolas De Loof28d0c592014-10-01 15:07:26 +020079```
80
Nicolas De Loofb32f5522014-10-06 23:05:56 +020081# Passing Jenkins launcher parameters
82
83Argument you pass to docker running the jenkins image are passed to jenkins launcher, so you can run for sample :
84```
85docker run jenkins --version
86```
87This will dump Jenkins version, just like when you run jenkins as an executable war.
88
89You also can define jenkins arguments as `JENKINS_OPTS`. This is usefull to define a set of arguments to pass to jenkins launcher as you
90define a derived jenkins image based on the official one with some customized settings. The following sample Dockerfile uses this option
91to force use of HTTPS with a certificate included in the image
92
93```
94FROM jenkins:1.565.3
95
96COPY https.pem /var/lib/jenkins/cert
97COPY https.key /var/lib/jenkins/pk
98ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8083 --httpsCertificate=/var/lib/jenkins/cert --httpsPrivateKey=/var/lib/jenkins/pk
99EXPOSE 8083
100```
101
Michael Neale457a91c2014-09-26 20:53:22 +1000102# Installing more tools
103
Yaroslav Halchenkoa7e44062015-03-05 12:37:01 -0500104You can run your container as root - and install via apt-get, install as part of build steps via jenkins tool installers, or you can create your own Dockerfile to customise, for example:
Michael Neale3e124ed2014-07-18 15:12:27 +1000105
Michael Neale83e5d482014-09-28 13:14:25 +1000106```
107FROM jenkins
starandtina1dd04e52015-03-07 09:35:27 +0800108# if we want to install via apt
109USER root
Christophe Labouisse83e35482014-11-19 18:06:28 +0100110RUN apt-get update && apt-get install -y ruby make more-thing-here
Michael Neale83e5d482014-09-28 13:14:25 +1000111USER jenkins # drop back to the regular jenkins user - good practice
Nicolas De Loof91181652014-10-04 08:31:01 +0200112```
113
114In such a derived image, you can customize your jenkins instance with hook scripts or additional plugins.
Nicolas De Loofacb86492014-10-24 13:43:13 +0200115For this purpose, use `/usr/share/jenkins/ref` as a place to define the default JENKINS_HOME content you
116wish the target installation to look like :
Michael Neale83e5d482014-09-28 13:14:25 +1000117
118```
Nicolas De Loofacb86492014-10-24 13:43:13 +0200119FROM jenkins
Carlos Sanchez11fd2a02015-04-23 18:03:23 -0700120COPY plugins.txt /usr/share/jenkins/ref/
Nicolas De Loofacb86492014-10-24 13:43:13 +0200121COPY custom.groovy /usr/share/jenkins/ref/init.groovy.d/custom.groovy
Carlos Sanchez11fd2a02015-04-23 18:03:23 -0700122RUN /usr/local/bin/plugins.sh /usr/share/jenkins/ref/plugins.txt
Nicolas De Loof91181652014-10-04 08:31:01 +0200123```
124
Nicolas De Loofacb86492014-10-24 13:43:13 +0200125When jenkins container starts, it will check JENKINS_HOME has this reference content, and copy them there if required. It will not override such files, so if you upgraded some plugins from UI they won't be reverted on next start.
126
Nicolas De Loof91181652014-10-04 08:31:01 +0200127Also see [JENKINS-24986](https://issues.jenkins-ci.org/browse/JENKINS-24986)
128
Nicolas De Loofacb86492014-10-24 13:43:13 +0200129For your convenience, you also can use a plain text file to define plugins to be installed (using core-support plugin format)
130```
131pluginID:version
132anotherPluginID:version
133```
134And in derived Dockerfile just invoke the utility plugin.sh script
135```
136FROM jenkins
137COPY plugins.txt /usr/share/jenkins/plugins.txt
138RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
139```
140
Nicolas De Loof91181652014-10-04 08:31:01 +0200141
Michael Neale3e124ed2014-07-18 15:12:27 +1000142# Upgrading
143
Michael Nealefe683742014-09-26 20:49:30 +1000144All the data needed is in the /var/jenkins_home directory - so depending on how you manage that - depends on how you upgrade. Generally - you can copy it out - and then "docker pull" the image again - and you will have the latest LTS - you can then start up with -v pointing to that data (/var/jenkins_home) and everything will be as you left it.
Michael Neale3e124ed2014-07-18 15:12:27 +1000145
Michael Nealefe683742014-09-26 20:49:30 +1000146As always - please ensure that you know how to drive docker - especially volume handling!
Michael Neale709841c2014-07-14 12:16:58 +1000147
Michael Nealefe683742014-09-26 20:49:30 +1000148# Questions?
Michael Neale709841c2014-07-14 12:16:58 +1000149
Michael Nealefe683742014-09-26 20:49:30 +1000150Jump on irc.freenode.net and the #jenkins room. Ask!