├── sample ├── .gitignore └── pom.xml ├── jenkins ├── plugins.csv ├── init │ └── master-executors.groovy ├── plugins.awk ├── Dockerfile └── jenkins-init.sh ├── maven-git └── Dockerfile ├── jenkins.json ├── node └── Dockerfile └── README.md /sample/.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | *.iml -------------------------------------------------------------------------------- /jenkins/plugins.csv: -------------------------------------------------------------------------------- 1 | mesos,latest 2 | scm-api,0.2 3 | git-client,1.11.0 4 | git,2.2.7 -------------------------------------------------------------------------------- /maven-git/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM maven:3 2 | 3 | RUN apt-get update && apt-get -y install git -------------------------------------------------------------------------------- /jenkins/init/master-executors.groovy: -------------------------------------------------------------------------------- 1 | import hudson.model.*; 2 | import jenkins.model.*; 3 | 4 | println "--> disabling master executors" 5 | 6 | Jenkins.instance.setNumExecutors(0) -------------------------------------------------------------------------------- /jenkins/plugins.awk: -------------------------------------------------------------------------------- 1 | BEGIN { FS="," } 2 | { 3 | print "curl -sSL --create-dirs -o /usr/share/jenkins/plugins/" $1 ".hpi https://updates.jenkins-ci.org/" ($2 == "latest" ? "latest/" : "download/plugins/" $1 "/" $2 "/") $1 ".hpi" 4 | } -------------------------------------------------------------------------------- /jenkins.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": "jenkins", 3 | "container": { 4 | "type": "DOCKER", 5 | "docker": { 6 | "image": "jlrigau/jenkins", 7 | "network": "HOST" 8 | }, 9 | "volumes": [ 10 | { 11 | "containerPath": "/var/jenkins_home", 12 | "hostPath": "/var/data/jenkins", 13 | "mode": "RW" 14 | } 15 | ] 16 | }, 17 | "cpus": 0.2, 18 | "mem": 128.0, 19 | "instances": 1 20 | } -------------------------------------------------------------------------------- /sample/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 4.0.0 8 | 9 | sample 10 | sample 11 | 1.0-SNAPSHOT 12 | 13 | -------------------------------------------------------------------------------- /jenkins/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM jenkins:weekly 2 | 3 | ADD init/*.groovy /usr/share/jenkins/init.groovy.d/ 4 | 5 | USER root 6 | 7 | RUN apt-get update && apt-get -y install libsvn1 8 | 9 | ADD http://downloads.mesosphere.io/master/debian/7/mesos_0.21.1-1.0.debian77_amd64.deb /tmp/mesos.deb 10 | 11 | RUN dpkg -i /tmp/mesos.deb && rm /tmp/mesos.deb 12 | 13 | RUN mkdir -p /usr/share/jenkins/plugins && \ 14 | chown -R jenkins /usr/share/jenkins/plugins /usr/share/jenkins/init.groovy.d 15 | 16 | ADD plugins.awk plugins.csv /usr/share/jenkins/ 17 | 18 | RUN awk -f /usr/share/jenkins/plugins.awk /usr/share/jenkins/plugins.csv | sh 19 | 20 | ADD jenkins-init.sh /usr/local/bin/jenkins-init.sh 21 | 22 | VOLUME ["/var/jenkins_home"] 23 | 24 | ENTRYPOINT ["/usr/local/bin/jenkins-init.sh"] -------------------------------------------------------------------------------- /jenkins/jenkins-init.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # if `docker run` first argument start with `--` the user is passing jenkins launcher arguments 4 | if [[ $# -lt 1 ]] || [[ "$1" == "--"* ]]; then 5 | echo "Copying init scripts" 6 | mkdir -p $JENKINS_HOME/init.groovy.d 7 | find /usr/share/jenkins/init.groovy.d/ -type f -exec cp {} $JENKINS_HOME/init.groovy.d/ \; 8 | 9 | echo "Copying plugins" 10 | mkdir -p $JENKINS_HOME/plugins 11 | find /usr/share/jenkins/plugins/ -type f -exec cp {} $JENKINS_HOME/plugins/ \; 12 | 13 | chown -R jenkins:jenkins $JENKINS_HOME 14 | if [[ -z "$@" ]]; then 15 | exec su jenkins -c "/usr/local/bin/jenkins.sh" 16 | else 17 | PARAMS="$@" 18 | exec su jenkins -c "/usr/local/bin/jenkins.sh \"$PARAMS\"" 19 | fi 20 | fi 21 | 22 | # As argument is not jenkins, assume user want to run his own process, for sample a `bash` shell to explore this image 23 | exec "$@" -------------------------------------------------------------------------------- /node/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM jlrigau/maven-git 2 | 3 | # verify gpg and sha256: http://nodejs.org/dist/v0.10.30/SHASUMS256.txt.asc 4 | # gpg: aka "Timothy J Fontaine (Work) " 5 | # gpg: aka "Julien Gilli " 6 | RUN gpg --keyserver pool.sks-keyservers.net --recv-keys 7937DFD2AB06298B2293C3187D33FF9D0246406D 114F43EE0176B71C7BC219DD50A3051F888C628D 7 | 8 | ENV NODE_VERSION 0.12.5 9 | ENV NPM_VERSION 2.11.3 10 | 11 | RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" \ 12 | && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ 13 | && gpg --verify SHASUMS256.txt.asc \ 14 | && grep " node-v$NODE_VERSION-linux-x64.tar.gz\$" SHASUMS256.txt.asc | sha256sum -c - \ 15 | && tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 \ 16 | && rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc \ 17 | && npm install -g npm@"$NPM_VERSION" \ 18 | && npm cache clear 19 | 20 | # use https instead of git protocol to avoid Connection refused 21 | RUN git config --global url."https://".insteadOf git:// 22 | 23 | CMD [ "node" ] 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ci-mesos 2 | 3 | ## Jenkins Docker image 4 | 5 | Open jenkins Dockerfile 6 | 7 | * Check FROM jenkins:weekly 8 | * Show Mesos native library setup 9 | * Check Jenkins configuration 10 | * Check master num executors=0 11 | * Plugin management with .csv file 12 | * Check mesos plugin presence 13 | 14 | ## Show Marathon definition file 15 | 16 | ```shell 17 | $curl -X POST -H "Content-Type: application/json" http://MARATHON_PUBLIC_HOST:8080/v2/apps -d@jenkins.json 18 | ``` 19 | 20 | * Show application in Marathon interface 21 | * Show Jenkins logs on Mesos slave 22 | 23 | ```shell 24 | $docker ps 25 | $docker logs -f $(docker ps -lq) 26 | ``` 27 | 28 | ## Go to Jenkins through URL 29 | 30 | ## Configure Mesos Cluster on Jenkins 31 | 32 | * Mesos native library path=/usr/lib/libmesos.so 33 | * Mesos Master [hostname:port]=MESOS_HOST:5050 34 | * Checkpointing=Yes 35 | 36 | ## Show the new Framework on Mesos interface 37 | 38 | ## Create a Slave Info for Java 39 | 40 | * Label String=java 41 | * Idle Termination Minutes=30 42 | * check Use Docker Containerizer 43 | * Docker Image=java:7 44 | 45 | ## Create a new project with Java on Jenkins 46 | 47 | * Project type=Freestyle project 48 | * Project name=Projet Java 49 | * Restrict where this project can be run=java 50 | * Add build step 51 | * Execute shell 52 | * Command=java -version 53 | * Save Project and run it 54 | 55 | ## Schedule a build 56 | 57 | * Check Build Queue 58 | * Check Build Executor Status 59 | * Check Console Output 60 | 61 | ## Check Jenkins node 62 | 63 | * Check node on Jenkins 64 | * Check active tasks on Mesos Jenkins Scheduler framework 65 | * Check container on Mesos slave 66 | 67 | ```shell 68 | $docker ps 69 | ``` 70 | 71 | ## Configure Maven 72 | 73 | * On Configure System add a new Maven installation 74 | * Name=maven 75 | * Check Install automatically 76 | * Install from Apache with version 3.2.2 77 | 78 | ## Create a Slave Info for Maven 79 | 80 | * Label String=maven 81 | * Idle Termination Minutes=30 82 | * check Use Docker Containerizer 83 | * Docker Image=jlrigau/maven-git 84 | 85 | ## Create a new Maven project on Jenkins 86 | 87 | * Project type=Maven project 88 | * Project name=Projet Maven 89 | * Restrict where this project can be run=maven 90 | * Configure Source Code Management 91 | * Check Git 92 | * Repository URL=https://github.com/jlrigau/ci-mesos.git 93 | * Configure Build 94 | * Root POM=sample/pom.xml 95 | * Goals and options=clean package 96 | * Save Project and run it 97 | 98 | ## Connect to slave container 99 | 100 | ```shell 101 | $docker exec -it CONTAINER_ID /bin/bash 102 | ``` 103 | 104 | * Look at /jenkins/workspace/Projet Maven 105 | --------------------------------------------------------------------------------