Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

64
@jlrigau #containerized_jenkins Un Jenkins amélioré avec Docker, Mesos et Marathon Expert Continuous Delivery Coach DevOps @ Xebia IT Architects jlrigau @jlrigau

Transcript of Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

Page 1: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Un Jenkins amélioré avec Docker, Mesos et Marathon

Expert Continuous Delivery Coach DevOps

@ Xebia IT Architects

jlrigau@jlrigau

Page 2: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

Objectifs

Page 3: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Objectifs

• Simplifier la gestion de Jenkins en le conteneurisant avec Docker et en le déployant au sein d’un cluster Mesos avec le framework Marathon

• Utiliser les ressources du cluster Mesos pour créer des slaves Jenkins à la demande en s’appuyant sur des conteneurs Docker

Page 4: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

Outils

Page 5: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Jenkins• Serveur d’intégration continue

• Projet open-source maintenu par CloudBees

• Écrit en Java

“An extensible open source continuous integration server”

Page 6: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Docker• Gestionnaire de conteneurs

• Projet open-source maintenu par Docker Inc.

• Écrit en Go

“Build, Ship and Run Any App, Anywhere”

Page 7: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Mesos• Gestionnaire de cluster

• Projet open-source maintenu par la Fondation Apache

• Écrit en C++

“Program against your datacenter like it’s a single pool of resources”

Page 8: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Marathon• Framework Mesos

• Projet open-source maintenu par Mesosphere

• Écrit en Scala

“Deploy and manage containers on top of Apache Mesos at scale”

Page 9: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

Design

Page 10: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Architecture

MesosMaster

MesosSlave

MesosSlave

Marathon

Jenkins Scheduler

Cluster Mesos

quorum = 1

Page 11: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Jenkins Master

Marathon MesosMaster

MesosSlave Docker Jenkins

Master

Mesos Slave

Page 12: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Jenkins Slaves

JenkinsScheduler

MesosMaster

MesosSlave Docker Jenkins

Slave

Mesos Slave

Page 13: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@YourTwitterHandle@YourTwitterHandle@jlrigau#containerized_jenkins

Demo - Jenkins Master

Page 14: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

FROM jenkins:weekly

ADD init/*.groovy /usr/share/jenkins/init.groovy.d/

USER root

RUN apt-get update && apt-get -y install libsvn1 ADD http://downloads.mesosphere.io/master/debian/7/mesos_0.21.1-1.0.debian77_amd64.deb

/tmp/mesos.deb RUN dpkg -i /tmp/mesos.deb && rm /tmp/mesos.deb

RUN mkdir -p /usr/share/jenkins/plugins && \ chown -R jenkins /usr/share/jenkins/plugins /usr/share/jenkins/init.groovy.d

ADD plugins.awk plugins.csv /usr/share/jenkins/ RUN awk -f /usr/share/jenkins/plugins.awk /usr/share/jenkins/plugins.csv | sh

ADD jenkins-init.sh /usr/local/bin/jenkins-init.sh VOLUME ["/var/jenkins_home"] ENTRYPOINT ["/usr/local/bin/jenkins-init.sh"]

Jenkins Dockerfile

Page 15: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

FROM jenkins:weekly

ADD init/*.groovy /usr/share/jenkins/init.groovy.d/

USER root

RUN apt-get update && apt-get -y install libsvn1 ADD http://downloads.mesosphere.io/master/debian/7/mesos_0.21.1-1.0.debian77_amd64.deb

/tmp/mesos.deb RUN dpkg -i /tmp/mesos.deb && rm /tmp/mesos.deb

RUN mkdir -p /usr/share/jenkins/plugins && \ chown -R jenkins /usr/share/jenkins/plugins /usr/share/jenkins/init.groovy.d

ADD plugins.awk plugins.csv /usr/share/jenkins/ RUN awk -f /usr/share/jenkins/plugins.awk /usr/share/jenkins/plugins.csv | sh

ADD jenkins-init.sh /usr/local/bin/jenkins-init.sh VOLUME ["/var/jenkins_home"] ENTRYPOINT ["/usr/local/bin/jenkins-init.sh"]

Jenkins Dockerfile

Page 16: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

import hudson.model.*; import jenkins.model.*;

println "--> disabling master executors"

Jenkins.instance.setNumExecutors(0)

master-executors.groovy

Page 17: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

FROM jenkins:weekly

ADD init/*.groovy /usr/share/jenkins/init.groovy.d/

USER root

RUN apt-get update && apt-get -y install libsvn1 ADD http://downloads.mesosphere.io/master/debian/7/mesos_0.21.1-1.0.debian77_amd64.deb

/tmp/mesos.deb RUN dpkg -i /tmp/mesos.deb && rm /tmp/mesos.deb

RUN mkdir -p /usr/share/jenkins/plugins && \ chown -R jenkins /usr/share/jenkins/plugins /usr/share/jenkins/init.groovy.d

ADD plugins.awk plugins.csv /usr/share/jenkins/ RUN awk -f /usr/share/jenkins/plugins.awk /usr/share/jenkins/plugins.csv | sh

ADD jenkins-init.sh /usr/local/bin/jenkins-init.sh VOLUME ["/var/jenkins_home"] ENTRYPOINT ["/usr/local/bin/jenkins-init.sh"]

Jenkins Dockerfile

Page 18: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

FROM jenkins:weekly

ADD init/*.groovy /usr/share/jenkins/init.groovy.d/

USER root

RUN apt-get update && apt-get -y install libsvn1 ADD http://downloads.mesosphere.io/master/debian/7/mesos_0.21.1-1.0.debian77_amd64.deb

/tmp/mesos.deb RUN dpkg -i /tmp/mesos.deb && rm /tmp/mesos.deb

RUN mkdir -p /usr/share/jenkins/plugins && \ chown -R jenkins /usr/share/jenkins/plugins /usr/share/jenkins/init.groovy.d

ADD plugins.awk plugins.csv /usr/share/jenkins/ RUN awk -f /usr/share/jenkins/plugins.awk /usr/share/jenkins/plugins.csv | sh

ADD jenkins-init.sh /usr/local/bin/jenkins-init.sh VOLUME ["/var/jenkins_home"] ENTRYPOINT ["/usr/local/bin/jenkins-init.sh"]

Jenkins Dockerfile

Page 19: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

mesos,latest scm-api,0.2 git-client,1.11.0 git,2.2.7

plugins.csv

Page 20: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

BEGIN { FS="," } { 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"

}

plugins.awk

Page 21: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

mesos,latest scm-api,0.2 git-client,1.11.0 git,2.2.7

plugins.csv

Page 22: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

FROM jenkins:weekly

ADD init/*.groovy /usr/share/jenkins/init.groovy.d/

USER root

RUN apt-get update && apt-get -y install libsvn1 ADD http://downloads.mesosphere.io/master/debian/7/mesos_0.21.1-1.0.debian77_amd64.deb

/tmp/mesos.deb RUN dpkg -i /tmp/mesos.deb && rm /tmp/mesos.deb

RUN mkdir -p /usr/share/jenkins/plugins && \ chown -R jenkins /usr/share/jenkins/plugins /usr/share/jenkins/init.groovy.d

ADD plugins.awk plugins.csv /usr/share/jenkins/ RUN awk -f /usr/share/jenkins/plugins.awk /usr/share/jenkins/plugins.csv | sh

ADD jenkins-init.sh /usr/local/bin/jenkins-init.sh VOLUME ["/var/jenkins_home"] ENTRYPOINT ["/usr/local/bin/jenkins-init.sh"]

Jenkins Dockerfile

Page 23: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Cluster Mesos

Page 24: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Mesos Slaves

Page 25: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Framework Mesos

Page 26: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Marathon

Page 27: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

{ "id": "jenkins", "container": { "type": "DOCKER", "docker": { "image": "jlrigau/jenkins", "network": "HOST" }, "volumes": [ { "containerPath": "/var/jenkins_home", "hostPath": "/var/data/jenkins", "mode": "RW" } ] }, "cpus": 0.2, "mem": 128.0, "instances": 1 }

jenkins.json

Page 28: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

{ "id": "jenkins", "container": { "type": "DOCKER", "docker": { "image": "jlrigau/jenkins", "network": "HOST" }, "volumes": [ { "containerPath": "/var/jenkins_home", "hostPath": "/var/data/jenkins", "mode": "RW" } ] }, "cpus": 0.2, "mem": 128.0, "instances": 1 }

jenkins.json

Page 29: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

{ "id": "jenkins", "container": { "type": "DOCKER", "docker": { "image": "jlrigau/jenkins", "network": "HOST" }, "volumes": [ { "containerPath": "/var/jenkins_home", "hostPath": "/var/data/jenkins", "mode": "RW" } ] }, "cpus": 0.2, "mem": 128.0, "instances": 1 }

jenkins.json

Page 30: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

{ "id": "jenkins", "container": { "type": "DOCKER", "docker": { "image": "jlrigau/jenkins", "network": "HOST" }, "volumes": [ { "containerPath": "/var/jenkins_home", "hostPath": "/var/data/jenkins", "mode": "RW" } ] }, "cpus": 0.2, "mem": 128.0, "instances": 1 }

jenkins.json

Page 31: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

$curl -X POST -H "Content-Type: application/json” http:// MARATHON_PUBLIC_HOST:8080/v2/apps [email protected]

Déploiement de Jenkins

Page 32: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Jenkins est lancé…

Page 33: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

… mais sur quel slave ?

Page 34: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Tâche active

Page 35: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

root@ip-172-31-14-112:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d85414d1ad4f jlrigau/jenkins:latest "/usr/local/bin/jenk 11 minutes ago Up 11 minutes mesos-f1c49c55-8075-4865-b644-7d35465c8a96

docker ps

Page 36: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

root@ip-172-31-14-112:~# docker logs $(docker ps -lq) Copying init scripts Copying plugins /usr/share/jenkins/ref/init.groovy.d/tcp-slave-angent-port.groovy /usr/share/jenkins/ref/init.groovy.d/tcp-slave-angent-port.groovy -> init.groovy.d/tcp-slave-angent-port.groovy copy init.groovy.d/tcp-slave-angent-port.groovy to JENKINS_HOME Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME") Apr 07, 2015 11:33:28 PM winstone.Logger logInternal INFO: Beginning extraction from war file Apr 07, 2015 11:33:30 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: jetty-winstone-2.8 Apr 07, 2015 11:33:32 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: NO JSP Support for , did not find org.apache.jasper.servlet.JspServlet Jenkins home directory: /var/jenkins_home found at: EnvVars.masterEnvVars.get("JENKINS_HOME") Apr 07, 2015 11:33:32 PM org.eclipse.jetty.util.log.JavaUtilLog info INFO: Started [email protected]:8080 Apr 07, 2015 11:33:32 PM winstone.Logger logInternal INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled Apr 07, 2015 11:33:33 PM jenkins.InitReactorRunner$1 onAttained INFO: Started initialization Apr 07, 2015 11:33:58 PM jenkins.InitReactorRunner$1 onAttained INFO: Listed all plugins Apr 07, 2015 11:33:58 PM jenkins.InitReactorRunner$1 onAttained INFO: Prepared all plugins Apr 07, 2015 11:33:58 PM jenkins.InitReactorRunner$1 onAttained INFO: Started all plugins Apr 07, 2015 11:33:59 PM jenkins.InitReactorRunner$1 onAttained INFO: Augmented all extensions Apr 07, 2015 11:34:02 PM jenkins.InitReactorRunner$1 onAttained INFO: Loaded all jobs Apr 07, 2015 11:34:02 PM jenkins.util.groovy.GroovyHookScript execute INFO: Executing /var/jenkins_home/init.groovy.d/master-executors.groovy Apr 07, 2015 11:34:02 PM org.jenkinsci.main.modules.sshd.SSHD start INFO: Started SSHD at port 60955 --> disabling master executors Apr 07, 2015 11:34:03 PM jenkins.util.groovy.GroovyHookScript execute INFO: Executing /var/jenkins_home/init.groovy.d/tcp-slave-angent-port.groovy Apr 07, 2015 11:34:03 PM jenkins.InitReactorRunner$1 onAttained INFO: Completed initialization Apr 07, 2015 11:34:03 PM hudson.WebAppMain$3 run INFO: Jenkins is fully up and running --> setting agent port for jnlp

docker logs $(docker ps -lq)

Page 37: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Jenkins is alive!

Page 38: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

# of executors

Page 39: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Plugin Mesos

Page 40: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@YourTwitterHandle@YourTwitterHandle@jlrigau#containerized_jenkins

Demo - Jenkins Slaves

Page 41: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Jenkins Scheduler

Page 42: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Framework Mesos

Page 43: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Java Slave Info

Page 44: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Projet Java

Page 45: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

java -version

Page 46: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Build Success !

Page 47: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Console Output

Page 48: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Jenkins nodes

Page 49: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Tâche active

Page 50: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

root@ip-172-31-14-111:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ee5455595cc5 java:7 "/bin/sh -c 'java -D 15 minutes ago Up 15 minutes mesos-d6692494-0d90-4782-a887-702f6a6cd3fa

docker ps

Page 51: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Configure Maven

Page 52: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Maven/Git Slave Info

Page 53: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Projet Maven

Page 54: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Source Code Management

Page 55: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Source Code Management

Page 56: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Build Success !

Page 57: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Git checkout

Page 58: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

BUILD SUCCESS

Page 59: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Tâches actives

Page 60: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

root@ip-172-31-14-112:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f5d271f37950 jlrigau/maven-git:latest "/bin/sh -c 'java -D 43 seconds ago Up 42 seconds mesos-ed390fd9-6abc-452a-a5f2-cf195151b9a6 78bd7391c980 java:7 "/bin/sh -c 'java -D 45 seconds ago Up 45 seconds mesos-85d716dd-c887-42ce-a4bd-8b1883f89a71 9ab7272b32da jlrigau/jenkins:latest "/usr/local/bin/jenk About an hour ago Up About an hour mesos-9082d0e2-3ff8-4133-9e1e-6959d9ebbfcb

docker ps

Page 61: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

root@ip-172-31-14-112:~# docker exec -it f5d271f37950 /bin/bash root@ip-172-31-14-112:/# ls -l /jenkins/workspace/Projet\ Maven/ total 20 -rw-r--r-- 1 root root 2229 Apr 8 01:12 README.md drwxr-xr-x 3 root root 4096 Apr 8 01:12 jenkins -rw-r--r-- 1 root root 342 Apr 8 01:12 jenkins.json drwxr-xr-x 2 root root 4096 Apr 8 01:12 maven-git drwxr-xr-x 3 root root 4096 Apr 8 01:12 sample

docker exec

Page 62: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@YourTwitterHandle@YourTwitterHandle@jlrigau#containerized_jenkins

Summary

Page 63: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@jlrigau#containerized_jenkins

Liens• Sources du Tools in Action

• https://github.com/jlrigau/ci-mesos

• Sources de la configuration du cluster Mesos

• https://github.com/WeScale/mesosphere-walking-tutorial

• Sources d’inspiration

• Delivering eBay’s CI Solution with Apache Mesos - Part I

• Delivering eBay’s CI Solution with Apache Mesos - Part II

Page 64: Un jenkins amélioré avec docker mesos et marathon à Devoxx 2015

@YourTwitterHandle@YourTwitterHandle@jlrigau#containerized_jenkins

Q & A