├── 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 | 25 | 26 | 22 27 | JENKINSSLAVE1_CREDENTIALSID 28 | 29 | 30 | 0 31 | 0 32 | 33 | 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 | --------------------------------------------------------------------------------