| Michael Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 1 | # Official Jenkins Docker image |
| Michael Neale | 2dedbdb | 2014-07-09 16:58:10 +1000 | [diff] [blame] | 2 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 3 | The Jenkins Continuous Integration and Delivery server. |
| Michael Neale | 711e12e | 2014-07-16 11:02:46 +1000 | [diff] [blame] | 4 | |
| Michael Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 5 | This is a fully functional Jenkins server, based on the Long Term Support release |
| 6 | http://jenkins-ci.org/ |
| Michael Neale | 711e12e | 2014-07-16 11:02:46 +1000 | [diff] [blame] | 7 | |
| Michael Neale | 71eb3ab | 2014-07-09 18:04:01 +1000 | [diff] [blame] | 8 | |
| Michael Neale | 00190fb | 2014-07-18 15:17:18 +1000 | [diff] [blame] | 9 | <img src="http://jenkins-ci.org/sites/default/files/jenkins_logo.png"/> |
| 10 | |
| Michael Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 11 | |
| 12 | # Usage |
| Michael Neale | 71eb3ab | 2014-07-09 18:04:01 +1000 | [diff] [blame] | 13 | |
| 14 | ``` |
| Michael Neale | 709841c | 2014-07-14 12:16:58 +1000 | [diff] [blame] | 15 | docker run -p 8080:8080 jenkins |
| Michael Neale | 71eb3ab | 2014-07-09 18:04:01 +1000 | [diff] [blame] | 16 | ``` |
| 17 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 18 | This will store the workspace in /var/jenkins_home. All Jenkins data lives in there - including plugins and configuration. |
| 19 | You will probably want to make that a persistent volume (recommended): |
| Michael Neale | 71eb3ab | 2014-07-09 18:04:01 +1000 | [diff] [blame] | 20 | |
| 21 | ``` |
| Michael Neale | 709841c | 2014-07-14 12:16:58 +1000 | [diff] [blame] | 22 | docker run -p 8080:8080 -v /your/home:/var/jenkins_home jenkins |
| Michael Neale | 71eb3ab | 2014-07-09 18:04:01 +1000 | [diff] [blame] | 23 | ``` |
| 24 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 25 | This will store the jenkins data in /your/home on the host. |
| 26 | Ensure that /your/home is accessible by the jenkins user in container (jenkins user - uid 102 normally - or use -u root). |
| 27 | |
| 28 | |
| 29 | You can also use a volume container: |
| 30 | |
| 31 | ``` |
| 32 | docker run --name myjenkins -p 8080:8080 -v /var/jenkins_home jenkins |
| 33 | ``` |
| 34 | |
| 35 | Then myjenkins container has the volume (please do read about docker volume handling to find out more). |
| 36 | |
| Michael Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 37 | ## Backing up data |
| 38 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 39 | If you bind mount in a volume - you can simply back up that directory |
| 40 | (which is jenkins_home) at any time. |
| Michael Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 41 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 42 | This 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 Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 43 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 44 | If your volume is inside a container - you can use ```docker cp $ID:/var/jenkins_home``` command to extract the data. |
| 45 | Note 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 Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 48 | |
| 49 | You can run builds on the master (out of the box) buf 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. |
| 50 | |
| Michael Neale | 2627b96 | 2014-07-21 15:52:23 +1000 | [diff] [blame] | 51 | <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 Loof | 28d0c59 | 2014-10-01 15:07:26 +0200 | [diff] [blame] | 53 | # Passing JVM parameters |
| 54 | |
| 55 | You might need to customize the JVM running Jenkins, typically to pass system properties or tweak heap memory settings. Use JAVA_OPTS environment |
| 56 | variable for this purpose : |
| 57 | |
| 58 | ``` |
| 59 | docker run --name myjenkins -p 8080:8080 -env JAVA_OPTS=-Dhudson.footerURL=http://mycompany.com jenkins |
| 60 | ``` |
| 61 | |
| Michael Neale | 457a91c | 2014-09-26 20:53:22 +1000 | [diff] [blame] | 62 | # Installing more tools |
| 63 | |
| Michael Neale | 83e5d48 | 2014-09-28 13:14:25 +1000 | [diff] [blame] | 64 | You can run your container as root - and unstall 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 Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 65 | |
| Michael Neale | 83e5d48 | 2014-09-28 13:14:25 +1000 | [diff] [blame] | 66 | ``` |
| 67 | FROM jenkins |
| 68 | USER root # if we want to install via apt |
| 69 | RUN apt-get install -y ruby make more-thing-here |
| 70 | USER jenkins # drop back to the regular jenkins user - good practice |
| Nicolas De Loof | 9118165 | 2014-10-04 08:31:01 +0200 | [diff] [blame^] | 71 | ``` |
| 72 | |
| 73 | In such a derived image, you can customize your jenkins instance with hook scripts or additional plugins. |
| 74 | Those need to be packaged inside the executed jenkins.war, so use : |
| Michael Neale | 83e5d48 | 2014-09-28 13:14:25 +1000 | [diff] [blame] | 75 | |
| 76 | ``` |
| Nicolas De Loof | 9118165 | 2014-10-04 08:31:01 +0200 | [diff] [blame^] | 77 | RUM mkdir /tmp/WEB-INF/plugins |
| 78 | RUN curl -L https://updates.jenkins-ci.org/latest/git.hpi -o /tmp/WEB-INF/plugins/git.hpi |
| 79 | RUN curl -L https://updates.jenkins-ci.org/latest/git-client.hpi -o /tmp/WEB-INF/plugins/git-client.hpi |
| 80 | RUN cd /tmp; zip --grow /usr/share/jenkins/jenkins.war WEB-INF/* |
| 81 | ``` |
| 82 | |
| 83 | Also see [JENKINS-24986](https://issues.jenkins-ci.org/browse/JENKINS-24986) |
| 84 | |
| 85 | |
| Michael Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 86 | # Upgrading |
| 87 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 88 | All 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 Neale | 3e124ed | 2014-07-18 15:12:27 +1000 | [diff] [blame] | 89 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 90 | As always - please ensure that you know how to drive docker - especially volume handling! |
| Michael Neale | 709841c | 2014-07-14 12:16:58 +1000 | [diff] [blame] | 91 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 92 | # Questions? |
| Michael Neale | 709841c | 2014-07-14 12:16:58 +1000 | [diff] [blame] | 93 | |
| Michael Neale | fe68374 | 2014-09-26 20:49:30 +1000 | [diff] [blame] | 94 | Jump on irc.freenode.net and the #jenkins room. Ask! |