Jenkins в docker in mesos in ...

139
Jenkins Cloud Jenkins in Docker in Mesos in...

Transcript of Jenkins в docker in mesos in ...

Page 1: Jenkins в docker in mesos in ...

Jenkins Cloud Jenkins in Docker in Mesos in...

Page 2: Jenkins в docker in mesos in ...

@tolkv

2

@lavcraft

Page 3: Jenkins в docker in mesos in ...

Jenkins Cloud

● Amazon EC2

Page 4: Jenkins в docker in mesos in ...

Jenkins Cloud

● Amazon EC2● Eucalyptus

Page 5: Jenkins в docker in mesos in ...

Jenkins Cloud

● Amazon EC2● Eucalyptus● Docker● Mesos

Page 6: Jenkins в docker in mesos in ...

Jenkins Cloud

● Amazon EC2● Eucalyptus● Docker● Mesos

Page 7: Jenkins в docker in mesos in ...

Jenkins Cloud

● Amazon EC2● Eucalyptus● Docker● Mesos

Что дает:

● Jenkins Master в каждый дом(проект)● Shared Slaves● = Jenkins as a Service

Page 8: Jenkins в docker in mesos in ...

Предпосылки

● Jenkins Master – не самый стабильный

Page 9: Jenkins в docker in mesos in ...

Предпосылки

● Jenkins Master – не самый стабильный● Каждый хочет установить свой плагин

Page 10: Jenkins в docker in mesos in ...

Предпосылки

● Jenkins Master – не самый стабильный● Каждый хочет установить свой плагин● И настроить “правильно”

Page 11: Jenkins в docker in mesos in ...

Предпосылки

● Jenkins Master – не самый стабильный● Каждый хочет установить свой плагин● И настроить “правильно”● И вообще сделать всео “по уму”

Page 12: Jenkins в docker in mesos in ...

Хитрость

● Гды вы запускаете Jenkins?

Page 13: Jenkins в docker in mesos in ...

Хитрость

● Гды вы запускаете Jenkins?● На каких серверах запускать jenkins slave?

Page 14: Jenkins в docker in mesos in ...

Проект $

Ресурсы на проект

Prod

App1

App2

App3

Db1

Db2

Db3

Page 15: Jenkins в docker in mesos in ...

Проект $

Ресурсы на проект

Prod

App1

App2

App3

Db1

Db2

Db3

Dev

App1

App2

Db1

Page 16: Jenkins в docker in mesos in ...

Проект $

Ресурсы на проект

Prod

App1

App2

App3

Db1

Db2

Db3

Dev

App1

App2

Db1

Infra

Mon1

Mon2

Page 17: Jenkins в docker in mesos in ...

Проект $

Ресурсы на проект

Prod Dev Infra

Mon1

Mon2

Page 18: Jenkins в docker in mesos in ...

Проект $

Ресурсы на проект

Prod Dev Infra

Mon1

Mon2

Jenkins Resources

Page 19: Jenkins в docker in mesos in ...

Проект $

Ресурсы на проект

Prod Dev Infra

Mon1

Mon2

Jenkins Resources

Page 20: Jenkins в docker in mesos in ...

Хитрость

● Гды вы запускаете Jenkins?● На каких серверах запускать jenkins slave?● А почему бы не запускать билды на разработческих стендах?

Page 21: Jenkins в docker in mesos in ...
Page 22: Jenkins в docker in mesos in ...

С чего начать

* Что каждый может сделать придя домой

Page 23: Jenkins в docker in mesos in ...

ПодходыРаш

Page 24: Jenkins в docker in mesos in ...

ПодходыРациональный подход

Page 25: Jenkins в docker in mesos in ...

Подходы

VS

Page 26: Jenkins в docker in mesos in ...

Подходы

Page 27: Jenkins в docker in mesos in ...

Подходы

Page 28: Jenkins в docker in mesos in ...

Что имеется

● Docker

Page 29: Jenkins в docker in mesos in ...

Что имеется

● Docker● Mesos

Page 30: Jenkins в docker in mesos in ...

Что имеется

● Docker● Mesos● Maratrhon

Page 31: Jenkins в docker in mesos in ...

Что имеется

● Docker● Mesos● Maratrhon● zookeeper … ● …

Page 32: Jenkins в docker in mesos in ...

Jenkins

Page 33: Jenkins в docker in mesos in ...

Jenkins

Jenkins Master

Page 34: Jenkins в docker in mesos in ...

Jenkins

Jenkins Master Jenkins Slave

Page 35: Jenkins в docker in mesos in ...

Запихаем в Docker

Page 36: Jenkins в docker in mesos in ...

Запихаем в Docker

● Уже есть оффициальный на docker hubhttps://hub.docker.com/_/jenkins/

● Отлично! Запускаем!docker run -p 8080:8080 -it jenkins

Page 37: Jenkins в docker in mesos in ...

Запихаем в Docker

● Уже есть оффициальный на docker hubhttps://hub.docker.com/_/jenkins/

● Отлично! Запускаем!docker run -p 8080:8080 -it jenkins

● А как же плагины? Давайте разбираться!

Page 38: Jenkins в docker in mesos in ...

Начнем с Docker

https://github.com/jenkinsci/docker/blob/master/README.md#preinstalling-plugins

DockerfileFROM jenkins:2.32.1

COPY plugins.txt /usr/share/jenkins/ref/RUN /usr/local/bin/plugins.sh /usr/share/jenkins/ref/plugins.txt

Page 39: Jenkins в docker in mesos in ...

DockerfileFROM jenkins:2.32.1

COPY plugins.txt /usr/share/jenkins/ref/RUN /usr/local/bin/plugins.sh /usr/share/jenkins/ref/plugins.txt

Начнем с Docker

$ docker build .

Page 40: Jenkins в docker in mesos in ...

Начнем с Docker

$ cat plugins.txt

handlebars:1.1.1icon-shim:2.0.3ivy:1.27.1jackson2-api:2.7.3javadoc:1.4jquery-detached:1.2.1junit:1.19ldap:1.14mailer:1.18mapdb-api:1.0.9.0marathon:1.4.0matrix-auth:1.4matrix-project:1.8maven-plugin:2.14mesos:0.14.0metrics:3.1.2.9momentjs:1.1.1pam-auth:1.3pipeline-build-step:2.4pipeline-graph-analysis:1.3pipeline-input-step:2.5pipeline-milestone-step:1.3pipeline-rest-api:2.4pipeline-stage-step:2.2pipeline-stage-view:2.4plain-credentials:1.3resource-disposer:0.6scm-api:1.3script-security:1.25ssh-credentials:1.12ssh-slaves:1.13structs:1.5subversion:2.7.1timestamper:1.8.8token-macro:2.0windows-slaves:1.2workflow-aggregator:2.4workflow-api:2.8workflow-basic-steps:2.3workflow-cps-global-lib:2.5workflow-cps:2.24workflow-durable-task-step:2.8workflow-job:2.9workflow-multibranch:2.9.2workflow-scm-step:2.3workflow-step-api:2.7workflow-support:2.12ws-cleanup:0.32http_request:1.8.13

Page 41: Jenkins в docker in mesos in ...

Где взять plugins.txt

$ cd $JENKINS_HOME/plugins

Page 42: Jenkins в docker in mesos in ...

Где взять plugins.txt

$ cd $JENKINS_HOME/plugins$ tree├── <PLUGIN_NAME>│ ├── META-INF│ │ ├── MANIFEST.MF

Page 43: Jenkins в docker in mesos in ...

Где взять plugins.txt

$ cd $JENKINS_HOME/plugins$ tree├── <PLUGIN_NAME>│ ├── META-INF│ │ ├── MANIFEST.MF

Page 44: Jenkins в docker in mesos in ...

Где взять plugins.txt

$ cd $JENKINS_HOME/plugins$ tree├── <PLUGIN_NAME>│ ├── META-INF│ │ ├── MANIFEST.MF$ cat <PLUGIN_NAME>/META-INF/MANIFEST.MF

Page 45: Jenkins в docker in mesos in ...

Где взять plugins.txt

$ cd $JENKINS_HOME/plugins$ tree├── <PLUGIN_NAME>│ ├── META-INF│ │ ├── MANIFEST.MF$ cat <PLUGIN_NAME>/META-INF/MANIFEST.MF

Manifest-Version: 1.0Archiver-Version: Plexus ArchiverUrl: https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+API+PluginPlugin-Version: 2.8…

Page 46: Jenkins в docker in mesos in ...

Где взять plugins.txt

$ cd $JENKINS_HOME/plugins$ tree├── <PLUGIN_NAME>│ ├── META-INF│ │ ├── MANIFEST.MF$ cat <PLUGIN_NAME>/META-INF/MANIFEST.MF

Manifest-Version: 1.0Archiver-Version: Plexus ArchiverUrl: https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+API+PluginPlugin-Version: 2.8…

Page 47: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `MANIFEST.MF for all plugins`;do

done

Page 48: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do

done

Page 49: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do # Plugin-Version: 2.8 v=EXTRACT VERSION FROM FILE <plugin>/META-INF/MANIFEST.MFdone

Page 50: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do # Plugin-Version: 2.8 v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' ');done

Page 51: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do # Plugin-Version: 2.8 v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' ');done

Page 52: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do # Plugin-Version: 2.8 v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' ');done

Page 53: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do # Plugin-Version: 2.8 v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' ');done

Page 54: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' '); # $i = ./workflow-api/META-INF/MANIFEST.MFdone

Page 55: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' '); # ./workflow-api/META-INF/MANIFEST.MF mod=EXTRACT PLUGIN NAMEdone

Page 56: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' '); # ./workflow-api/META-INF/MANIFEST.MF mod=$(echo $i | cut -d'/' -f2); done

Page 57: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' '); # ./workflow-api/META-INF/MANIFEST.MF mod=$(echo $i | cut -d'/' -f2); done

Page 58: Jenkins в docker in mesos in ...

Где взять plugins.txt

for i in `find -d $JENKINS_HOME/plugins -name "MANIFEST.MF"̀ ;do v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' '); mod=$(echo $i | cut -d'/' -f2); done

Page 59: Jenkins в docker in mesos in ...

Где взять plugins.txt

cd $JENKINS_HOME/plugins

for i in `find -d . -name "MANIFEST.MF"̀ ;do v=$(cat $i| grep Plugin-Ver | cut -d':' -f2 | tr -d ' '); mod=$(echo $i | cut -d'/' -f2); echo $mod:$v; # pluginname:versiondone

Page 60: Jenkins в docker in mesos in ...

Инициализируем jenkins_home

● Запускаем Jenkins и монтируем JENKINS_HOMEdocker run \

$PWD/jenkins_home:/var/jenkins_home \-p 8080:8080 \

-it jenkins● Теперь у нас в jenkins_home все нужные плагины

Page 61: Jenkins в docker in mesos in ...

Теперь у нас есть jenkins в Docker?

Page 62: Jenkins в docker in mesos in ...

НЕТТеперь у нас есть jenkins в Docker?

Page 63: Jenkins в docker in mesos in ...

Задеплоим Jenkins-Master

Page 64: Jenkins в docker in mesos in ...

Mesos + Marathon + Marathon-LB

Page 65: Jenkins в docker in mesos in ...

Деплоим Jenkins

Marathon Manifest [Json]

Jenkins Master

Page 66: Jenkins в docker in mesos in ...

Деплоим Jenkins

Marathon Manifest [Json]

Jenkins Master

POST

Page 67: Jenkins в docker in mesos in ...

Деплоим Jenkins

Marathon Manifest [Json]

Jenkins Master

POST EVENT

Reload

Page 68: Jenkins в docker in mesos in ...

Деплоим Jenkins

Marathon Manifest [Json]

Jenkins Master

POST EVENT

Reload

ANNOUNCE

Page 69: Jenkins в docker in mesos in ...

Деплоим Jenkins

Marathon Manifest [Json]

Jenkins Master

POST EVENT

Reload

ANNOUNCE

OPEN UI

Page 70: Jenkins в docker in mesos in ...

Деплоим Jenkins

Marathon Manifest [Json]

Jenkins Master

{"id": "/my_project/jenkins", "cmd": "...", "cpus": 2, "mem": 2048, "instances": 1, "container": { "type": "DOCKER", "docker": { "image": "docker.moscow.alfaintra.net/jenkins:2.32.1-mesos", } }, "healthChecks": [ { "path": "/proxy/raw/jenkins/passport/login", "protocol": "HTTP", "portIndex": 0, ... } ], "portDefinitions": [ { "port": 11102, "protocol": "tcp", "name": "jenkinshttp", },{ "port": 11103, "protocol": "tcp", "name": "jenkinsjnlp", "labels": {} }, { "port": 11104, "protocol": "tcp", "name": "mesoslibprocess", "labels": {} } ] }

Page 71: Jenkins в docker in mesos in ...

Публикуем по http

Marathon Manifest [Json]

Jenkins Master

{"id": "/my_project/jenkins", ... "labels": { "HAPROXY_DEPLOYMENT_GROUP": "cd_my_project_jenkins", "HAPROXY_GROUP": "cd_my_project_jenkins", "HAPROXY_0_PATH": "/proxy/raw/jenkins/my_project", "HAPROXY_0_VHOST": "my_project.jenkins.cd" },

…}

Page 72: Jenkins в docker in mesos in ...

Marathon LB

Marathon Manifest [Json]

Jenkins Master

{"id": "/my_project/jenkins", ... "labels": { "HAPROXY_DEPLOYMENT_GROUP": "cd_my_project_jenkins", "HAPROXY_GROUP": "cd_my_project_jenkins", "HAPROXY_0_PATH": "/proxy/raw/jenkins/my_project", "HAPROXY_0_VHOST": "my_project.jenkins.cd" "HAPROXY_0_HTTP_FRONTEND_ACL_WITH_PATH": " acl host_{cleanedUpHostname} hdr(host) -i {hostname}\n acl path_{backend} path_beg {path}\n use_backend {backend} if path_{backend}\n", },

…}

Page 73: Jenkins в docker in mesos in ...

Marathon

Marathon Manifest [Json]

Jenkins Master

Page 74: Jenkins в docker in mesos in ...

Marathon

Marathon Manifest [Json]

Jenkins Master

Page 75: Jenkins в docker in mesos in ...

Открываем

● VHOST + PATH если есть DNS

Page 76: Jenkins в docker in mesos in ...

Открываем

● VHOST + PATH если есть DNS● Иначе кастомизируем Haproxy acl для варианта только с PATH

Page 77: Jenkins в docker in mesos in ...

Открываем

● VHOST + PATH если есть DNS● Иначе кастомизируем Haproxy acl для варианта только с PATH● curl http://jenkins.my_project.mesosdev/● curl http://any_nodehostname/proxy/raw/jenkins/my_project

Page 78: Jenkins в docker in mesos in ...

Открываем

● VHOST + PATH если есть DNS● Иначе кастомизируем Haproxy acl для варианта только с PATH● curl http://jenkins.my_project.mesosdev/● curl http://any_nodehostname/proxy/raw/jenkins/my_project

Page 79: Jenkins в docker in mesos in ...

Открываем

● VHOST + PATH если есть DNS● Иначе кастомизируем Haproxy acl для варианта только с PATH● curl http://jenkins.my_project.mesosdev/● curl http://any_nodehostname/proxy/raw/jenkins/my_project● Jenkins не поддерживает X-Forwarded

ну или у меня не получилось завести...

Page 80: Jenkins в docker in mesos in ...

Открываем

● VHOST + PATH если есть DNS● Иначе кастомизируем Haproxy acl для варианта только с PATH● curl http://jenkins.my_project.mesosdev/● curl http://any_nodehostname/proxy/raw/jenkins/my_project● Jenkins не поддерживает X-Forwarded

ну или у меня не получилось завести...● см --prefix=/proxy/raw/jenkins/my_project

Page 81: Jenkins в docker in mesos in ...

Проверим jenkins-mesos плагин

Page 82: Jenkins в docker in mesos in ...

Jenkins Mesos Plugin$JENKINS_URL/manage → $JENKINS_URL/configure

Page 83: Jenkins в docker in mesos in ...

Jenkins Mesos Plugin$JENKINS_URL/manage → $JENKINS_URL/configure

Page 84: Jenkins в docker in mesos in ...

Jenkins Mesos Plugin$JENKINS_URL/manage → $JENKINS_URL/configure

Page 85: Jenkins в docker in mesos in ...

Mesos Hostname

Mesos native library path

Page 86: Jenkins в docker in mesos in ...

APPLY

Page 87: Jenkins в docker in mesos in ...

Не найден mesos.so

APPLY

Page 88: Jenkins в docker in mesos in ...

Как это должно работать?

Jenkins Master

JenkinsSlaveJenkins

SlaveJenkinsSlaveJenkins

Slave

Page 89: Jenkins в docker in mesos in ...

Как это должно работать?

MesosMaster

AgentAgent

AgentAgentJenkins

Master

JenkinsSlaveJenkins

SlaveJenkinsSlaveJenkins

Slave

Page 90: Jenkins в docker in mesos in ...

Как это должно работать?

MesosMaster

AgentAgent

AgentAgentJenkins

Master

JenkinsSlaveJenkins

SlaveJenkinsSlaveJenkins

Slave

Page 91: Jenkins в docker in mesos in ...

Как это должно работать?

Page 92: Jenkins в docker in mesos in ...

Как это должно работать?

Jenkins Master

MesosMaster

MesosMasterMesos

Master

AgentAgent

AgentAgent

JenkinsSlave

Page 93: Jenkins в docker in mesos in ...

Mesos Native

$ docker build .

DockerfileFROM jenkins:2.32.1

ARG MESOS_VERSIONARG MESOS_VERSION_DEBENV MESOS_VERSION ${MESOS_VERSION:-1.1.0}ENV MESOS_VERSION_DEB ${MESOS_VERSION_DEB:-2.0.107.debian81}ENV TMP_DIR=/tmp/mesos

USER rootRUN apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF && \ echo "deb http://repos.mesosphere.com/debian jessie main" > /etc/apt/sources.list.d/mesosphere.list && \ apt-get update && \ apt-get install -y --no-install-recommends mesos=$MESOS_VERSION-$MESOS_VERSION_DEB && \ rm -rf /var/lib/apt/lists/*USER jenkins

COPY plugins.txt /usr/share/jenkins/ref/RUN /usr/local/bin/plugins.sh /usr/share/jenkins/ref/plugins.txt

Page 94: Jenkins в docker in mesos in ...

Mesos NativeDockerfileFROM jenkins:2.32.1

...

USER rootRUN apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF && \ echo "deb http://repos.mesosphere.com/debian jessie main" > /etc/apt/sources.list.d/mesosphere.list && \ apt-get update && \ apt-get install -y --no-install-recommends \ mesos=$MESOS_VERSION-$MESOS_VERSION_DEB && \ rm -rf /var/lib/apt/lists/*USER jenkins

COPY plugins.txt /usr/share/jenkins/ref/RUN /usr/local/bin/plugins.sh /usr/share/jenkins/ref/plugins.txt

$ docker build .

Page 95: Jenkins в docker in mesos in ...

Что там в Mesos?

Page 96: Jenkins в docker in mesos in ...

Что там в Mesos?

Page 97: Jenkins в docker in mesos in ...

Что там в Mesos?

Page 98: Jenkins в docker in mesos in ...

Что там в Mesos?

Page 99: Jenkins в docker in mesos in ...

Mesos Hostname

Specifies the hostname:port of the Mesos master.

● node1:zk_port,node2:zk_port,node3:zk_port

Page 100: Jenkins в docker in mesos in ...

Mesos Hostname

Specifies the hostname:port of the Mesos master.

● node1:zk_port,node2:zk_port,node3:zk_port● http://node1:2181/api/v1/scheduler

Page 101: Jenkins в docker in mesos in ...

Mesos Hostname

Specifies the hostname:port of the Mesos master.

● node1:zk_port,node2:zk_port,node3:zk_port● http://node1:2181/api/v1/scheduler ● zk://node1:2181,node2:2181,node3:2181

Page 102: Jenkins в docker in mesos in ...

Mesos Hostname

Specifies the hostname:port of the Mesos master.

● node1:zk_port,node2:zk_port,node3:zk_port● http://node1:2181/api/v1/scheduler ● zk://node1:2181,node2:2181,node3:2181● zk://node1:2181,node2:2181,node3:2181/mesos

Page 103: Jenkins в docker in mesos in ...

Mesos Hostname

Specifies the hostname:port of the Mesos master.

● node1:zk_port,node2:zk_port,node3:zk_port● http://node1:2181/api/v1/scheduler ● zk://node1:2181,node2:2181,node3:2181● zk://node1:2181,node2:2181,node3:2181/mesos

Page 104: Jenkins в docker in mesos in ...

А теперь что в Mesos?

Page 105: Jenkins в docker in mesos in ...

А теперь что в Mesos?

Page 106: Jenkins в docker in mesos in ...

А теперь что в Mesos?

Page 107: Jenkins в docker in mesos in ...

Разберемся

Page 108: Jenkins в docker in mesos in ...

Разберемся

CLI

JNLP

HTTP

MESOS

Jenkins in Docker

Page 109: Jenkins в docker in mesos in ...

Разберемся

CLI_PORT

JNLP_PORT

HTTP_PORT

CLI_ADVERTIZED_PORT

MESOS_PORT

HTTP_ADVERTIZED_PORT

JNLP_ADVERTIZED_PORT

MESOS_ADVERTIZED_PORT

Внутри контейнера

Внутренние порты Внешние

порты

Jenkins in Docker

Во вне

Page 110: Jenkins в docker in mesos in ...

Как лечим

● -Dhudson.TcpSlaveAgentListener.port=$PORT1

● JENKINS_SLAVE_AGENT_PORT=$PORT1

● --httpPort=$PORT0

Page 111: Jenkins в docker in mesos in ...

Разберемся

CLI_ADVERTIZED_PORT

HTTP_ADVERTIZED_PORT

JNLP_ADVERTIZED_PORT

MESOS_ADVERTIZED_PORT

Внутренние порты Внешние

порты

Jenkins in Docker

MesosMaster

LIBPROCESS_ADVERTIZED_PORTLIBPROCESS_ADVERTIZED_IP

CL_PORT

JNLP_PORT

HTTP_PORT

CLI_ADVERTIZED_PORT

MESOS_PORT

HTTP_ADVERTIZED_PORT

JNLP_ADVERTIZED_PORT

MESOS_ADVERTIZED_PORT

Внутри контейнера

Во вне

Page 112: Jenkins в docker in mesos in ...

Как лечим

● -Dhudson.TcpSlaveAgentListener.port=$PORT1

● JENKINS_SLAVE_AGENT_PORT=$PORT1

● --httpPort=$PORT0

● LIBPROCESS_PORT=$PORT2

Page 113: Jenkins в docker in mesos in ...

Как лечим

● -Dhudson.TcpSlaveAgentListener.port=$PORT1

● JENKINS_SLAVE_AGENT_PORT=$PORT1

● --httpPort=$PORT0

● LIBPROCESS_PORT=$PORT2

Page 114: Jenkins в docker in mesos in ...

Build Now

Page 115: Jenkins в docker in mesos in ...

Что еще можно потюнить?

Page 116: Jenkins в docker in mesos in ...

Соберём что нибудь

Page 117: Jenkins в docker in mesos in ...

Набор инструментов

● Jenkins Tools○ M3○ Docker○ Gradle○ ...

Page 118: Jenkins в docker in mesos in ...

Набор инструментов

● Jenkins Tools○ M3○ Docker○ Gradle○ …

● Docker image per task type

Page 119: Jenkins в docker in mesos in ...

Jenkins Jobs. Pipeline

node('mesos-jendev'){...}

Page 120: Jenkins в docker in mesos in ...

Jenkins Jobs. Pipeline

node('mesos-jendev'){...}

Название Jenkins Cloud

Page 121: Jenkins в docker in mesos in ...

Jenkins Jobs. Pipeline. Custom image

node('mesos-jendev'){...}

node('mesos-jendev:jenkins-slave:java-with-curl'){...}

Название Jenkins Cloud в котором будет запущен таск

Название образа в котором будет запущен новый jenkins-slave

Page 122: Jenkins в docker in mesos in ...

Jenkins Jobs. Pipeline. Dind Image

node('mesos-jendev:jenkins-slave:java-dind'){...}

Page 123: Jenkins в docker in mesos in ...

Docker client конфликт версий

● Официальный dind образ для docker 1.12+

Page 124: Jenkins в docker in mesos in ...

Docker client конфликт версий

● Официальный dind образ для docker 1.12+● Docker на сервере 1.10 – 1.12

Page 125: Jenkins в docker in mesos in ...

Docker client конфликт версий

● Официальный dind образ для docker 1.12+● Docker на сервере 1.10 – 1.12● Клиент 1.12 не работает с сервером 1.10

Page 126: Jenkins в docker in mesos in ...

Docker client конфликт версий

● Официальный dind образ для docker 1.12+● Docker на сервере 1.10 – 1.12● Клиент 1.12 не работает с сервером 1.10● Сделаем свой?

Page 127: Jenkins в docker in mesos in ...

Docker client конфликт версий

● Официальный dind образ для docker 1.12+● Docker на сервере 1.10 – 1.12● Клиент 1.12 не работает с сервером 1.10● Сделаем свой?● Нет, обновим Docker

Page 128: Jenkins в docker in mesos in ...

Jenkins Jobs. Pipeline. Custom image

node('mesos-jendev:jenkins-slave:java-with-curl'){ stage('fetch'){ checkout scm } stage('build'){

... }

}

Page 129: Jenkins в docker in mesos in ...

node('mesos-jendev:jenkins-slave:java-with-curl'){ stage('fetch'){ checkout scm } stage('build'){ def server = Artifactory.server 'alfa-laboratory' def rtGradle = Artifactory.newGradleBuild() def buildInfo = Artifactory.newBuildInfo() rtGradle.run tasks: 'snapshot', buildInfo: buildInfo }}

Jenkins Jobs. Pipeline. Custom image

Page 130: Jenkins в docker in mesos in ...

Jenkins Job in Mesos Cluster in Docker

Page 131: Jenkins в docker in mesos in ...

Jenkins Slaves под нашим контролем

Page 132: Jenkins в docker in mesos in ...

● jenkins home persistence – требует mesos 1.0.1 + (Incubating API)● работа с Network BRIDGE – боль

○ jenkins jnlp4 handshake○ advertized ports○ mesos LIBPROCESS

● build cache and incremental builds● gradle cache problems gradle/851● link to MESOS_SANDBOX from builds

Немного проблем

Page 133: Jenkins в docker in mesos in ...

Резюме

● Jenkins`a стоит бояться● Jenkins Cloud для энтузиастов

Page 134: Jenkins в docker in mesos in ...

Резюме

● Jenkins`a стоит бояться● Jenkins Cloud для энтузиастов● Подумайте 3 раза нужно ли вам это● Если не нужно не используйте

Page 135: Jenkins в docker in mesos in ...

Резюме

● Jenkins`a стоит бояться● Jenkins Cloud для энтузиастов● Подумайте 3 раза нужно ли вам это● Если не нужно не используйте● Можно упороться и заставить работать Jenkins Cloud

Page 136: Jenkins в docker in mesos in ...

node('mesos-jendev:jenkins-slave:java-with-httpie'){echo '1'deployTo()echo '5'

}@NonCpsdef deployTo() {

echo '2'isExistInCluster()echo '4'

}def isExistInCluster() {

echo '3'}

Pipeline прямиком из ада

Page 137: Jenkins в docker in mesos in ...

Pipeline прямиком из ада> 1> 2> 3> 5> End Stage> End Pipline

Page 138: Jenkins в docker in mesos in ...

node('mesos-jendev:jenkins-slave:java-with-httpie'){echo '1'deployTo()echo '5'

}@NonCpsdef deployTo() {

echo '2'isExistInCluster()echo '4' // < ---- SKIPED

}def isExistInCluster() {

echo '3'}

Pipeline прямиком из ада

Page 139: Jenkins в docker in mesos in ...

Заходите на чайhttps://goo.gl/HjfOz5

QA