blob: 48ab63b3f74025db8c43a8e9f33eaca1c9718744 [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
Michael Nealefe683742014-09-26 20:49:30 +100025This will store the jenkins data in /your/home on the host.
Nicolas De Loof3d784992014-11-28 10:15:15 +010026Ensure that /your/home is accessible by the jenkins user in container (jenkins user - uid 1000).
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
Michael Nealefe683742014-09-26 20:49:30 +100044If your volume is inside a container - you can use ```docker cp $ID:/var/jenkins_home``` command to extract the data.
45Note that some symlinks on some OSes may be converted to copies (this can confuse jenkins with lastStableBuild links etc)
46
47# Attaching build executors
Michael Neale3e124ed2014-07-18 15:12:27 +100048
rhels9aa88402015-06-01 17:12:25 -070049You 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 +100050
Michael Neale2627b962014-07-21 15:52:23 +100051<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.
52
Nicolas De Loof28d0c592014-10-01 15:07:26 +020053# Passing JVM parameters
54
55You might need to customize the JVM running Jenkins, typically to pass system properties or tweak heap memory settings. Use JAVA_OPTS environment
56variable for this purpose :
57
58```
Carlos Sanchez67b0ff52015-07-02 12:13:49 +020059docker 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 +020060```
61
Nicolas De Loofb32f5522014-10-06 23:05:56 +020062# Passing Jenkins launcher parameters
63
64Argument you pass to docker running the jenkins image are passed to jenkins launcher, so you can run for sample :
65```
66docker run jenkins --version
67```
68This will dump Jenkins version, just like when you run jenkins as an executable war.
69
70You also can define jenkins arguments as `JENKINS_OPTS`. This is usefull to define a set of arguments to pass to jenkins launcher as you
71define a derived jenkins image based on the official one with some customized settings. The following sample Dockerfile uses this option
72to force use of HTTPS with a certificate included in the image
73
74```
75FROM jenkins:1.565.3
76
77COPY https.pem /var/lib/jenkins/cert
78COPY https.key /var/lib/jenkins/pk
79ENV JENKINS_OPTS --httpPort=-1 --httpsPort=8083 --httpsCertificate=/var/lib/jenkins/cert --httpsPrivateKey=/var/lib/jenkins/pk
80EXPOSE 8083
81```
82
Michael Neale457a91c2014-09-26 20:53:22 +100083# Installing more tools
84
Yaroslav Halchenkoa7e44062015-03-05 12:37:01 -050085You 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 +100086
Michael Neale83e5d482014-09-28 13:14:25 +100087```
88FROM jenkins
starandtina1dd04e52015-03-07 09:35:27 +080089# if we want to install via apt
90USER root
Christophe Labouisse83e35482014-11-19 18:06:28 +010091RUN apt-get update && apt-get install -y ruby make more-thing-here
Michael Neale83e5d482014-09-28 13:14:25 +100092USER jenkins # drop back to the regular jenkins user - good practice
Nicolas De Loof91181652014-10-04 08:31:01 +020093```
94
95In such a derived image, you can customize your jenkins instance with hook scripts or additional plugins.
Nicolas De Loofacb86492014-10-24 13:43:13 +020096For this purpose, use `/usr/share/jenkins/ref` as a place to define the default JENKINS_HOME content you
97wish the target installation to look like :
Michael Neale83e5d482014-09-28 13:14:25 +100098
99```
Nicolas De Loofacb86492014-10-24 13:43:13 +0200100FROM jenkins
Carlos Sanchez11fd2a02015-04-23 18:03:23 -0700101COPY plugins.txt /usr/share/jenkins/ref/
Nicolas De Loofacb86492014-10-24 13:43:13 +0200102COPY custom.groovy /usr/share/jenkins/ref/init.groovy.d/custom.groovy
Carlos Sanchez11fd2a02015-04-23 18:03:23 -0700103RUN /usr/local/bin/plugins.sh /usr/share/jenkins/ref/plugins.txt
Nicolas De Loof91181652014-10-04 08:31:01 +0200104```
105
Nicolas De Loofacb86492014-10-24 13:43:13 +0200106When 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.
107
Nicolas De Loof91181652014-10-04 08:31:01 +0200108Also see [JENKINS-24986](https://issues.jenkins-ci.org/browse/JENKINS-24986)
109
Nicolas De Loofacb86492014-10-24 13:43:13 +0200110For your convenience, you also can use a plain text file to define plugins to be installed (using core-support plugin format)
111```
112pluginID:version
113anotherPluginID:version
114```
115And in derived Dockerfile just invoke the utility plugin.sh script
116```
117FROM jenkins
118COPY plugins.txt /usr/share/jenkins/plugins.txt
119RUN /usr/local/bin/plugins.sh /usr/share/jenkins/plugins.txt
120```
121
Nicolas De Loof91181652014-10-04 08:31:01 +0200122
Michael Neale3e124ed2014-07-18 15:12:27 +1000123# Upgrading
124
Michael Nealefe683742014-09-26 20:49:30 +1000125All 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 +1000126
Michael Nealefe683742014-09-26 20:49:30 +1000127As always - please ensure that you know how to drive docker - especially volume handling!
Michael Neale709841c2014-07-14 12:16:58 +1000128
Michael Nealefe683742014-09-26 20:49:30 +1000129# Questions?
Michael Neale709841c2014-07-14 12:16:58 +1000130
Michael Nealefe683742014-09-26 20:49:30 +1000131Jump on irc.freenode.net and the #jenkins room. Ask!