├── LICENSE
├── README.md
├── docker-compose.yml
├── jenkins
├── Dockerfile
├── backup.xml
├── config.xml
├── replace_config.sh
└── startup.sh
├── jenkinsdockerslave1
└── Dockerfile
├── jenkinssetup
├── Dockerfile
├── credentials
│ ├── jenkins_credentials.py
│ └── jenkins_credentials.sh
├── get_job.sh
├── jenkins_jobs.ini
├── jobs
│ ├── docker.xml
│ ├── docker_build.xml
│ ├── docker_echo_job.xml
│ ├── example_simple_docker_job.yaml
│ ├── example_simple_job.yaml
│ ├── simple_jenkins_job.xml
│ ├── simple_jenkins_swarm_job.xml
│ └── workflow_docker.xml
├── nodes
│ └── jenkins_node.py
├── plugins
│ ├── jenkins_check_plugins.py
│ ├── jenkins_plugins.py
│ └── jenkins_plugins_list.py
└── startup.sh
├── jenkinsslave1
└── Dockerfile
├── jenkinsswarmslave1
├── Dockerfile
└── startup.sh
└── phoenix.sh
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4 |
5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6 |
7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
8 |
9 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Jenkins Phoenix Deployment
2 |
3 | CI as code.
4 |
5 | [Phoenix](http://www.slideshare.net/IanMiell/clipboards/my-clips) [Deployment](https://www.thoughtworks.com/radar/tools/immutable-servers): Never worry about how your environment was built again, because you do it routinely.
6 |
7 | Note: requires docker-compose v1.4+
8 |
9 | ## Intro
10 |
11 | See [here](https://zwischenzugs.wordpress.com/2016/01/24/ci-as-code-stateless-jenkins-deployments-using-docker/) for an explanation.
12 |
13 | ## Tags
14 |
15 | ### v3.0
16 |
17 | Jenkins swarm client example added (jenkinsswarmslave1)
18 |
19 | Plugins added for 3.0:
20 | - backup - backs up configuration on demand
21 | - jenkinslint - gives advice on your jenkins setup
22 | - build-timeout - allow a build timeout
23 | - build-pipeline-plugin - provides view of build pipeline
24 | - buildgraph-view - provides alternative view of build pipeline
25 | - delivery-pipeline-plugin - provides view of delivery pipeline (ie through different environments)
26 | - workflow-aggregator - continuous delivery pipeline functionality
27 | - docker-build-publish - build and publish Docker projects to the Docker Hub
28 | - docker-workflow - use docker commands within pipelines
29 | - greenballs - green balls for success, not blue!
30 | - swarm - allow dynamic jenkins clients to be added via port 50000
31 |
32 | `get_job.sh` helper script added
33 |
34 | Jobs stored and added using xml
35 |
36 | Credential management improved
37 |
38 | Updated yaml to docker-compose v1.5+
39 |
40 |
41 | ## Running
42 |
43 | ```
44 | docker-compose up
45 | ```
46 |
47 | or
48 |
49 | ```
50 | ./phoenix.sh
51 | ```
52 |
53 | Then - once the dust has settled - navigate to http://localhost:8080
54 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | jenkinsslave1:
2 | container_name: jenkinsslave1
3 | build: jenkinsslave1
4 | jenkinsdockerslave1:
5 | container_name: jenkinsdockerslave1
6 | build: jenkinsdockerslave1
7 | volumes:
8 | - /var/run/docker.sock:/var/run/docker.sock
9 | - /var/lib/docker:/var/lib/docker
10 | jenkins:
11 | build: jenkins
12 | container_name: jenkins
13 | ports:
14 | - "8080:8080"
15 | - "50000:50000"
16 | links:
17 | - jenkinsslave1
18 | - jenkinsdockerslave1
19 | volumes:
20 | - /var/run/docker.sock:/var/run/docker.sock
21 | - /var/lib/docker:/var/lib/docker
22 | jenkinssetup:
23 | container_name: jenkinssetup
24 | build: jenkinssetup
25 | links:
26 | - jenkins
27 | jenkinsswarmslave1:
28 | container_name: jenkinsswarmslave1
29 | build: jenkinsswarmslave1
30 | links:
31 | - jenkins
32 |
--------------------------------------------------------------------------------
/jenkins/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM jenkins:2.7.1
2 |
3 | # Assume root privs
4 | USER root
5 | RUN apt-get update && apt-get install -y vim socat cron sudo docker.io
6 | RUN sed -i 's/^.sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/' /etc/sudoers
7 | RUN adduser jenkins sudo
8 | RUN adduser jenkins docker
9 | # Folders required for backup plugin
10 | RUN mkdir /var/jenkins_home_backup
11 | RUN chown jenkins: /var/jenkins_home_backup
12 | RUN mkdir /var/jenkins_home_restore
13 | RUN chown jenkins: /var/jenkins_home_restore
14 | # switch back to jenkins user
15 | USER jenkins
16 | # Add core jenkins config
17 | ADD config.xml /var/jenkins_home/config.xml
18 | ADD backup.xml /var/jenkins_home/backup.xml
19 | # Add replace_config.sh script to allow updates to config.xml
20 | ADD replace_config.sh /replace_config.sh
21 | # Add startup script and use as entrypoint
22 | ADD startup.sh /var/jenkins_home/startup.sh
23 |
24 | ENTRYPOINT ["/var/jenkins_home/startup.sh"]
25 |
--------------------------------------------------------------------------------
/jenkins/backup.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | /var/jenkins_home_backup
4 | true
5 | true
6 | true
7 | backup_@date@.@extension@
8 | TARGZIP
9 | false
10 | false
11 | false
12 | false
13 |
14 |
15 | false
16 |
17 |
18 |
--------------------------------------------------------------------------------
/jenkins/config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 1.642.1
5 | 2
6 | NORMAL
7 | true
8 |
9 |
10 | false
11 |
12 | ${ITEM_ROOTDIR}/workspace
13 | ${ITEM_ROOTDIR}/builds
14 |
15 |
16 |
17 |
18 |
19 | docker
20 |
21 |
22 | 2
23 | dockercloud
24 |
34 |
35 | /home/jenkins
36 | 100
37 | NORMAL
38 |
39 | 10
40 | 10
41 |
42 | 1
43 |
44 | imiell/jenkinsdockerslave
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 | false
54 | false
55 | false
56 |
57 |
58 |
59 |
60 |
61 | false
62 | PULL_ALWAYS
63 |
64 |
65 | http://172.17.0.1:4243
66 | 5
67 | 5
68 |
69 | 100
70 |
71 |
72 | 5
73 | 0
74 |
75 |
76 |
77 | All
78 | false
79 | false
80 |
81 |
82 |
83 | All
84 | 50000
85 |
86 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/jenkins/replace_config.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | set +x
3 |
4 | (
5 | read line <&0
6 | regexp='([^ ]*) ([A-Z0-9_]*) (.*)'
7 | if [[ $line =~ $regexp ]]
8 | then
9 | FILENAME_STRING=${BASH_REMATCH[1]}
10 | TEMPLATE_STRING=${BASH_REMATCH[2]}
11 | REPLACE_STRING=${BASH_REMATCH[3]}
12 | sed -i "s/$TEMPLATE_STRING/$REPLACE_STRING/g" $FILENAME_STRING
13 | else
14 | echo $0: not matched: $line
15 | fi
16 | ) >> /tmp/file_updater_log
17 |
--------------------------------------------------------------------------------
/jenkins/startup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Set up a cron daemon (logging heavily) in case we need to run periodic jobs
4 | sudo cron -L 8
5 |
6 | # Use socat to listen on port 9000. If anything comes in, write it out to Jenkins' config.xml
7 | # Can be called from a linked machine like so:
8 | #socat -u FILE:config.xml TCP:jenkins:9000
9 | # If this is used, we need to trigger a restart also.
10 | socat -u TCP-LISTEN:9000,reuseaddr,fork OPEN:/var/jenkins_home/config.xml,creat,trunk &
11 | socat -u TCP-LISTEN:9001,reuseaddr,fork EXEC:'/replace_config.sh > /tmp/asd && tac /tmp/asd' &
12 |
13 | # The original entrypoint for the jenkins container
14 | /bin/tini -- /usr/local/bin/jenkins.sh
15 |
--------------------------------------------------------------------------------
/jenkinsdockerslave1/Dockerfile:
--------------------------------------------------------------------------------
1 | # This Dockerfile is used to build an image containing basic stuff to be used as a Jenkins slave build node.
2 | FROM ubuntu:trusty
3 |
4 | # Make sure the package repository is up to date.
5 | RUN apt-get update && apt-get -y upgrade && apt-get install -y openssh-server docker.io
6 | RUN sed -i 's|session required pam_loginuid.so|session optional pam_loginuid.so|g' /etc/pam.d/sshd
7 | RUN mkdir -p /var/run/sshd
8 |
9 | # Install JDK 7 (latest edition)
10 | RUN apt-get install -y openjdk-7-jdk
11 |
12 | # Add user jenkins to the image
13 | RUN adduser --quiet jenkins
14 | # Set password for the jenkins user (you may want to alter this).
15 | RUN echo "jenkins:jenkins" | chpasswd
16 |
17 | RUN sed -i 's/^.sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/' /etc/sudoers
18 | RUN adduser jenkins sudo
19 |
20 | # Standard SSH port
21 | EXPOSE 22
22 |
23 | CMD ["/usr/sbin/sshd", "-D"]
24 |
--------------------------------------------------------------------------------
/jenkinssetup/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:trusty
2 | RUN apt-get update -y && apt-get install -y git python python-pip python-yaml curl socat default-jdk wget telnet
3 | RUN pip install setuptools PyYAML python-jenkins ordereddict jenkinsapi
4 | WORKDIR /jenkins_setup
5 | RUN git clone https://git.openstack.org/openstack-infra/jenkins-job-builder
6 | WORKDIR /jenkins_setup/jenkins-job-builder
7 | RUN python setup.py install
8 | ADD . /jenkins_setup
9 | ADD jenkins_jobs.ini /etc/jenkins_jobs/jenkins_jobs.ini
10 | WORKDIR /jenkins_setup
11 | CMD /jenkins_setup/startup.sh
12 |
--------------------------------------------------------------------------------
/jenkinssetup/credentials/jenkins_credentials.py:
--------------------------------------------------------------------------------
1 | from jenkinsapi.jenkins import Jenkins
2 | from jenkinsapi.credential import UsernamePasswordCredential, SSHKeyCredential
3 | import socket
4 |
5 | api = Jenkins('http://jenkins:8080')
6 | # Get a list of all global credentials
7 | credentials = api.credentials
8 | for key in credentials.credentials.keys():
9 | creds_dict = credentials.credentials[key].get_attributes()
10 | if creds_dict['json']['credentials']['description'] == 'jenkinsslave1 credentials':
11 | credentialsId = creds_dict['json']['credentials']['id']
12 | s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
13 | s.connect(('jenkins',9001))
14 | s.send('/var/jenkins_home/config.xml JENKINSSLAVE1_CREDENTIALSID ' + credentialsId)
15 |
--------------------------------------------------------------------------------
/jenkinssetup/credentials/jenkins_credentials.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | curl -XPOST 'jenkins:8080/credentials/store/system/domain/_/createCredentials' \
3 | --data-urlencode 'json={
4 | "": "0",
5 | "credentials": {
6 | "scope": "GLOBAL",
7 | "id": "",
8 | "username": "jenkins",
9 | "password": "jenkins",
10 | "description": "jenkinsslave1 credentials",
11 | "$class": "com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl"
12 | }
13 | }'
14 |
15 | echo 'Jenkins username/password credentials created'
16 |
--------------------------------------------------------------------------------
/jenkinssetup/get_job.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | java -jar jenkins-cli.jar -s http://jenkins:8080 get-job $1
4 |
--------------------------------------------------------------------------------
/jenkinssetup/jenkins_jobs.ini:
--------------------------------------------------------------------------------
1 | [job_builder]
2 | ignore_cache=True
3 | keep_descriptions=False
4 | include_path=.:scripts:~/git/
5 | recursive=False
6 | exclude=.*:manual:./development
7 | allow_duplicates=False
8 |
9 | [jenkins]
10 | user=jenkins
11 | password=1234567890abcdef1234567890abcdef
12 | url=http://jenkins:8080
13 | query_plugins_info=False
14 |
15 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/docker.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | false
6 |
7 |
8 |
9 | 3
10 | -1
11 | -1
12 | -1
13 |
14 |
15 |
16 |
17 | 2
18 |
19 |
20 | https://github.com/ianmiell/pgcharts
21 |
22 |
23 |
24 |
25 | */master
26 |
27 |
28 | false
29 |
30 |
31 |
32 | true
33 | false
34 |
35 |
36 |
37 |
38 | dockercloud
39 | false
40 | false
41 | false
42 | false
43 |
44 | false
45 |
46 |
47 | echo $(hostname)
48 |
49 |
50 |
51 |
52 |
53 |
54 | 1800
55 |
56 |
57 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/docker_build.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | false
6 |
7 | 2
8 |
9 |
10 | https://github.com/ianmiell/pgcharts
11 |
12 |
13 |
14 |
15 | */master
16 |
17 |
18 | false
19 |
20 |
21 |
22 | jenkinsdockerslave1
23 | false
24 | false
25 | false
26 | false
27 |
28 | false
29 |
30 |
31 |
32 | 172.17.0.1:4243
33 |
34 |
35 | test
36 | true
37 | true
38 | /tmp/workspace
39 | /tmp/workspace/docker-build/Dockerfile
40 | false
41 | true
42 |
43 | true
44 | true
45 | true
46 |
47 |
48 |
49 |
50 |
51 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/docker_echo_job.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Do not edit this job through the web!<!-- Managed by Jenkins Job Builder -->
5 | Simple docker run job
6 | false
7 |
8 |
9 |
10 | 3
11 | 20
12 | -1
13 | -1
14 |
15 |
16 |
17 |
18 | 2
19 |
20 |
21 | origin
22 | +refs/heads/*:refs/remotes/origin/*
23 | https://github.com/ianmiell/jenkins-phoenix.git
24 |
25 |
26 |
27 |
28 | origin/master
29 |
30 |
31 | false
32 |
33 |
34 |
35 |
36 | true
37 | false
38 |
39 |
40 |
41 |
42 | 5
43 | 3
44 | jenkinsdockerslave
45 | false
46 | false
47 | false
48 | false
49 |
50 |
51 |
52 |
53 |
54 | H * * * *
55 | false
56 |
57 |
58 | true
59 | /home/jenkins
60 |
61 |
62 | sudo docker run busybox echo hello
63 |
64 |
65 |
66 |
67 |
68 |
69 | 1800
70 |
71 |
72 |
73 |
74 |
75 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/example_simple_docker_job.yaml:
--------------------------------------------------------------------------------
1 | - scm:
2 | name: my-scm
3 | scm:
4 | - git:
5 | url: https://github.com/ianmiell/jenkins-phoenix.git
6 | branches:
7 | - origin/master
8 | skip-tag: true
9 | - builder:
10 | name: run-docker-echo
11 | builders:
12 | - shell: 'sudo docker run busybox echo hello'
13 | - job:
14 | name: docker_echo_job
15 | project-type: freestyle
16 | defaults: global
17 | description: 'Do not edit this job through the web!'
18 | disabled: false
19 | display-name: 'Simple docker run job'
20 | concurrent: true
21 | workspace: /home/jenkins
22 | quiet-period: 5
23 | block-downstream: false
24 | block-upstream: false
25 | retry-count: 3
26 | node: jenkinsdockerslave
27 | logrotate:
28 | daysToKeep: 3
29 | numToKeep: 20
30 | artifactDaysToKeep: -1
31 | artifactNumToKeep: -1
32 | builders:
33 | - run-docker-echo
34 | scm:
35 | - my-scm
36 | triggers:
37 | - github
38 | - pollscm:
39 | cron: "* * * * *"
40 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/example_simple_job.yaml:
--------------------------------------------------------------------------------
1 | - builder:
2 | name: echo-ok
3 | builders:
4 | - shell: 'echo OK'
5 | - job:
6 | name: eg_job
7 | project-type: freestyle
8 | defaults: global
9 | description: 'Do not edit this job through the web!'
10 | disabled: false
11 | display-name: 'Simple Jenkins job'
12 | concurrent: true
13 | workspace: /home/jenkins
14 | quiet-period: 5
15 | block-downstream: false
16 | block-upstream: false
17 | retry-count: 3
18 | node: jenkinsslave
19 | logrotate:
20 | daysToKeep: 3
21 | numToKeep: 20
22 | artifactDaysToKeep: -1
23 | artifactNumToKeep: -1
24 | builders:
25 | - echo-ok
26 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/simple_jenkins_job.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Do not edit this job through the web!<!-- Managed by Jenkins Job Builder -->
5 | Simple Jenkins job
6 | false
7 |
8 |
9 |
10 | 3
11 | 20
12 | -1
13 | -1
14 |
15 |
16 |
17 |
18 | 5
19 | 3
20 | jenkinsslave
21 | false
22 | false
23 | false
24 | false
25 |
26 | true
27 | /home/jenkins
28 |
29 |
30 | echo OK
31 |
32 |
33 |
34 |
35 |
36 |
37 | 1800
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/simple_jenkins_swarm_job.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Do not edit this job through the web!<!-- Managed by Jenkins Job Builder -->
5 | Simple Jenkins Swarm Job
6 | false
7 |
8 |
9 |
10 | 3
11 | 20
12 | -1
13 | -1
14 |
15 |
16 |
17 |
18 | 5
19 | 3
20 | swarm
21 | false
22 | false
23 | false
24 | false
25 |
26 | true
27 | /home/jenkins
28 |
29 |
30 | echo OK
31 |
32 |
33 |
34 |
35 |
36 |
37 | 1800
38 |
39 |
40 |
41 |
42 |
43 |
--------------------------------------------------------------------------------
/jenkinssetup/jobs/workflow_docker.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | false
6 |
7 |
8 |
14 | false
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/jenkinssetup/nodes/jenkins_node.py:
--------------------------------------------------------------------------------
1 | from jenkinsapi.jenkins import Jenkins
2 | from jenkinsapi.credential import UsernamePasswordCredential, SSHKeyCredential
3 |
4 | api = Jenkins('http://jenkins:8080')
5 | # Get a list of all global credentials
6 | creds = api.credentials
7 | credentialsId = creds.credentials.keys()[0]
8 |
9 | import jenkins
10 |
11 | j = jenkins.Jenkins('http://jenkins:8080')
12 |
13 | # jenkins slave
14 | params = {
15 | 'port': '22',
16 | 'username': 'jenkins',
17 | 'credentialsId': credentialsId,
18 | 'host': 'jenkinsslave1'
19 | }
20 | create = True
21 | for node in j.get_nodes():
22 | if node['name'] == 'jenkinsslave1':
23 | create = False
24 | if create:
25 | j.create_node(
26 | 'jenkinsslave1',
27 | nodeDescription='my test slave',
28 | remoteFS='/tmp',
29 | labels='jenkinsslave',
30 | launcher=jenkins.LAUNCHER_SSH,
31 | launcher_params=params
32 | )
33 |
34 | # jenkins docker slave
35 | params = {
36 | 'port': '22',
37 | 'username': 'jenkins',
38 | 'credentialsId': credentialsId,
39 | 'host': 'jenkinsdockerslave1'
40 | }
41 | create = True
42 | for node in j.get_nodes():
43 | if node['name'] == 'jenkinsdockerslave1':
44 | create = False
45 | if create:
46 | j.create_node(
47 | 'jenkinsdockerslave1',
48 | nodeDescription='my docker test slave',
49 | remoteFS='/tmp',
50 | labels='jenkinsdockerslave',
51 | launcher=jenkins.LAUNCHER_SSH,
52 | launcher_params=params
53 | )
54 |
--------------------------------------------------------------------------------
/jenkinssetup/plugins/jenkins_check_plugins.py:
--------------------------------------------------------------------------------
1 | import jenkins
2 | import time
3 | import jenkins_plugins_list
4 |
5 | plugins = jenkins_plugins_list.plugins
6 |
7 | # cf: https://updates.jenkins-ci.org/download/plugins/
8 |
9 | j = jenkins.Jenkins('http://jenkins:8080')
10 | while True:
11 | info = j.get_plugins()
12 | installed_plugins = []
13 | for key in info.keys():
14 | installed_plugins.append(key[0])
15 | break
16 |
17 | #print str(set(plugins))
18 | #print str(set(installed_plugins))
19 | #print str(set(plugins) - set(installed_plugins))
20 | if len(set(plugins) - set(installed_plugins)) == 0:
21 | print 'OK'
22 | else:
23 | print 'WAIT'
24 |
--------------------------------------------------------------------------------
/jenkinssetup/plugins/jenkins_plugins.py:
--------------------------------------------------------------------------------
1 | import jenkins
2 | import jenkins_plugins_list
3 |
4 | # cf: https://updates.jenkins-ci.org/download/plugins/
5 |
6 | j = jenkins.Jenkins('http://jenkins:8080')
7 | plugins = jenkins_plugins_list.plugins
8 | print 'Installing plugins starting: ' + str(plugins)
9 | for p in plugins:
10 | j.install_plugin(p)
11 | print 'Plugins requested. Wait for install to complete.'
12 |
13 |
--------------------------------------------------------------------------------
/jenkinssetup/plugins/jenkins_plugins_list.py:
--------------------------------------------------------------------------------
1 | plugins = (
2 | "build-timeout",
3 | "docker-build-publish",
4 | "docker-plugin",
5 | "jenkinslint",
6 | "git",
7 | "github",
8 | "build-pipeline-plugin",
9 | "delivery-pipeline-plugin",
10 | "workflow-aggregator",
11 | "docker-workflow",
12 | "buildgraph-view",
13 | "greenballs",
14 | "backup",
15 | "swarm",
16 | )
17 | #"pipeline-plugin",
18 | #"jenkinslint-plugin",
19 |
--------------------------------------------------------------------------------
/jenkinssetup/startup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | function wait_for_jenkins() {
4 | while [[ $(curl -sL -w "%{http_code}\\n" "http://jenkins:8080" -o /dev/null) != '200' ]]
5 | do
6 | echo 'Jenkins not up yet'
7 | sleep 5
8 | done
9 | echo 'Jenkins up and running'
10 | }
11 |
12 | function restart_and_wait_for_jenkins() {
13 | echo Restarting Jenkins
14 | curl -XPOST http://jenkins:8080/safeRestart
15 | wait_for_jenkins
16 | }
17 |
18 | wait_for_jenkins
19 |
20 | # Set up plugins. Restart until complete
21 | # do a while loop waiting for confirmed installation
22 | echo Plugin install started
23 | pushd plugins
24 | sleeptime=30
25 | while [[ /bin/true ]]
26 | do
27 | python jenkins_plugins.py
28 | sleeptime=$(($sleeptime + $sleeptime))
29 | echo waiting for $sleeptime before re-checking plugins
30 | sleep $sleeptime
31 | python jenkins_check_plugins.py
32 | if [[ $(python jenkins_check_plugins.py | tail -1) = 'OK' ]]
33 | then
34 | break
35 | fi
36 | restart_and_wait_for_jenkins
37 | done
38 | restart_and_wait_for_jenkins
39 | popd
40 | echo Plugin install complete
41 |
42 | # Set up credentials
43 | echo Setting up credentials
44 | pushd credentials
45 | ./jenkins_credentials.sh
46 | python jenkins_credentials.py
47 | popd
48 | echo Setting up credentials complete
49 |
50 | echo Set up nodes
51 | pushd nodes
52 | python jenkins_node.py
53 | popd
54 | echo Set up nodes done
55 |
56 | echo Uploading jobs
57 | pushd jobs
58 | # Use xml to upload docker job
59 | wget -qO- http://jenkins:8080/jnlpJars/jenkins-cli.jar > /jenkins_setup/jenkins-cli.jar
60 | cat docker.xml | java -jar /jenkins_setup/jenkins-cli.jar -s http://jenkins:8080 create-job 'dockercloud-echo-job'
61 | cat docker_echo_job.xml | java -jar /jenkins_setup/jenkins-cli.jar -s http://jenkins:8080 create-job 'docker-echo-job'
62 | cat simple_jenkins_job.xml | java -jar /jenkins_setup/jenkins-cli.jar -s http://jenkins:8080 create-job 'simple-jenkins-job'
63 | cat workflow_docker.xml | java -jar /jenkins_setup/jenkins-cli.jar -s http://jenkins:8080 create-job 'dockercloud-pipeline-job'
64 | cat docker_build.xml | java -jar /jenkins_setup/jenkins-cli.jar -s http://jenkins:8080 create-job 'docker-build'
65 | cat simple_jenkins_swarm_job.xml | java -jar /jenkins_setup/jenkins-cli.jar -s http://jenkins:8080 create-job 'simple-jenkins-swarm-job'
66 | popd
67 | echo Uploading jobs done
68 |
69 | # Sleep forever
70 | sleep infinity
71 |
--------------------------------------------------------------------------------
/jenkinsslave1/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM evarga/jenkins-slave
2 | RUN apt-get update -y && apt-get install -y git
3 |
--------------------------------------------------------------------------------
/jenkinsswarmslave1/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM ubuntu:trusty
2 | RUN groupadd -g 1000 jenkins
3 | RUN useradd -d /home/jenkins -s /bin/bash -m jenkins -u 1000 -g jenkins
4 | RUN echo jenkins:jpass | chpasswd
5 | RUN apt-get update && apt-get install -y openjdk-7-jre wget unzip
6 | RUN wget -O /home/jenkins/swarm-client-1.22-jar-with-dependencies.jar https://repo.jenkins-ci.org/releases/org/jenkins-ci/plugins/swarm-client/1.22/swarm-client-1.22-jar-with-dependencies.jar
7 | COPY startup.sh /usr/bin/startup.sh
8 | RUN chmod +x /usr/bin/startup.sh
9 | USER jenkins
10 | ENTRYPOINT ["/usr/bin/startup.sh"]
11 |
--------------------------------------------------------------------------------
/jenkinsswarmslave1/startup.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | SLAVE_JENKINS_SERVER=jenkins
3 | SLAVE_JENKINS_PORT=8080
4 | SLAVE_JENKINS_LABELS=swarm
5 | SLAVE_JENKINS_HOME=${JENKINS_HOME:-$HOME}
6 | echo "Wait three minutes before starting swarm client"
7 | sleep 180
8 | echo "Starting up swarm client with args:"
9 | echo "$@"
10 | echo "and env:"
11 | echo "$(env)"
12 | set -x
13 | java -jar /home/jenkins/swarm-client-1.22-jar-with-dependencies.jar -name jenkinsswarmslave1 -fsroot "$SLAVE_JENKINS_HOME" -labels "$SLAVE_JENKINS_LABELS" -master http://$SLAVE_JENKINS_SERVER:$SLAVE_JENKINS_PORT $@
14 | sleep infinity
15 |
--------------------------------------------------------------------------------
/phoenix.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | docker-compose rm -f && docker-compose build && docker-compose up
3 |
--------------------------------------------------------------------------------