Tribulaciones de un dev en
devops
Migrando CI
a Docker
Patxi Gortázar
patxi.gortazar@gmail.com
@fgortazar
2
Migrando CI a Docker
• Who
• What
• Why
• How
3
Who
Devops en Kurento
Profesor en URJC
Haskeller aficionado
@fgortazar
https://es.linkedin.com/in/franciscogortazar
MIGRANDO CIA DOCKER
4
Migrando CI a Docker
• Who
• What
• Why
• How
5
What
“Kurento is an Open Source SoftwareWebRTC media server”
MIGRANDO CIA DOCKER
6
What
MIGRANDO CIA DOCKER
https://webrtc.org
7
What
MIGRANDO CIA DOCKER
8
What
MIGRANDO CIA DOCKER
9
What
MIGRANDO CIA DOCKER
10
What
MIGRANDO CIA DOCKER
11
What
Kurento es...
• Media server
• APIs (clientes)
• Tutoriales
• Aplicaciones
MIGRANDO CIA DOCKER
12
What
MIGRANDO CIA DOCKER
13
What
Kurento en cifras:
curl https://api.github.com/orgs/kurento/repos
| grep -e '"name"'
| wc -l
30 repositorios publicos
find . -name config.xml | wc -l
334 jobs diferentes en Jenkins
MIGRANDO CIA DOCKER
14
What
Kurento en cifras:
• Cada release requiere desplegar +80 artefactos
Paquetes debian,
módulos npm,
módulos bower,
artefactos Maven (jar, sources, poms, javadocs)
MIGRANDO CIA DOCKER
15
Migrando CI a Docker
• Who
• What
• Why
• How
16
Why
Infraestructura OpenStack
• 88 cpus
• 188GB memoria
• 3TB disco
MIGRANDO CIA DOCKER
17
Why
Para construir el media server:
●
4 nodos UbuntuTrusty
●
2 nodos última release
Ubuntu
●
2 nodos trusty (versión
estable anterior)
MIGRANDO CIA DOCKER
Para construir los clientes:
●
4 nodos
Para infraestructura (Chef):
●
1 nodo
18
Why
MIGRANDO CIA DOCKER
deb
repo
Nightly build
chef-client
(Upgrades media server
on client nodes)
Client tests
1
2
19
Why
Deficiencias
• Máquinas separadas para media server y clientes
• Máquinas para media server divididas a su vez para
soportar diferentes versiones de Ubuntu
• Soporte de múltiples versiones del media server en la
misma máquina no disponible (problemas de
incompatibilidad de dependencias)
• Gestión de la configuración (Chef) demasiado compleja
– Especificidades de Jenkins
– Especificidades del tipo de nodo
MIGRANDO CIA DOCKER
20
Migrando CI a Docker
• Who
• What
• Why
• How
21
How
MIGRANDO CIA DOCKER
22
How
• Primera aproximación: marzo 2014 (Docker 0.9)
– No apto para producción
– Intento de lanzar esclavo Jenkins como contenedor:
múltiples procesos corriendo
– Jobs de Jenkins poco aptos para ser portados
(principalmente managed scripts)
– Intento de “provisionar” las imágenes Docker con Chef
(big fail!)
●
Ya deberíamos haberlo intuido de test-kitchen...
MIGRANDO CIA DOCKER
23
How
• Segunda aproximación: noviembre 2015 (Docker 1.8)
– Producto más maduro
– Procesos más claros
– Más herramientas (plugins, hubs privados, librerías de
gestión)
– Jobs en Jenkins más portables (bash scripts en
repositorio git)
– Jobs lanzan contenedores vs el job se lanza en el
contenedor
●
Más control sobre los contenedores
MIGRANDO CIA DOCKER
24
How
5 máquinas iguales
12 GB memoria
8 vCPUs
600 GB disco
Provisionadas con Chef Jenkins specifics + docker→
MIGRANDO CIA DOCKER
25
How
1 maestro
5 nodos iguales
MIGRANDO CIA DOCKER
26
How
¿Dónde vas a poner tus imágenes (privadas)?
●
Dogestry: usar s3 como registro de imágenes
MIGRANDO CIA DOCKER
27
How
¿Dónde vas a poner tus imágenes (privadas)?
●
Dogestry: usar s3 como registro de imágenes
MIGRANDO CIA DOCKER
28
How
¿Dónde vas a poner tus imágenes (privadas)?
docker run -d -p 5000:5000 --restart=always --name registry 
-v `pwd`/auth:/auth 
-e "REGISTRY_AUTH=htpasswd" 
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" 
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd 
-v `pwd`/certs:/certs 
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt 
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key 
registry:2
MIGRANDO CIA DOCKER
29
How
Imágenes para builds
Imágenes para aplicaciones
Imágenes para tests
MIGRANDO CIA DOCKER
30
How
Imágenes para builds
●
Pesadas
●
Una imagen por tool version (jdk7, jdk8)
●
docker pull ahead of time (si es posible)
●
Credenciales (firmar artefactos, despliegue...)
– Inyectadas desde Jenkins como ficheros
– Incorporadas al contenedor como volúmenes
– Variables de entorno para especificar su ubicación
MIGRANDO CIA DOCKER
31
How
Imágenes para builds en Kurento
●
dev-media-server (build-essentials, gstreamer…)
●
dev-integration (jdk, maven, node, npm, bower)
●
dev-documentation (sphinx, latex)
●
dev-operations (Chef DK)
MIGRANDO CIA DOCKER
32
How
Matrices de versiones
●
Ubuntu
– UbuntuTrusty
– UbuntuWily
– Ubuntu Xenial
MIGRANDO CIA DOCKER
●
JDK
– JDK 7
– JDK 8
33
How
Imágenes para builds
●
Matriz configuración dev-integration
– JDK
– Maven
– Node
– Npm
– Bower
MIGRANDO CIA DOCKER
34
How
Imágenes para builds
●
Ejecutan un paso previo de instalación de
dependencias
– Ahorra imágenes
– Costoso al arrancar… pero igualmente hay que generar la
imagen
– Se pierden al parar y eliminar el contenedor
MIGRANDO CIA DOCKER
35
How
Imágenes para aplicaciones
●
Media server
●
Tutoriales
●
Demos
MIGRANDO CIA DOCKER
36
How
Imágenes para tests
●
selenium/hub
●
selenium/node-chrome
●
selenium/node-firefox
MIGRANDO CIA DOCKER
●
selenium/node-chrome-
debug
●
selenium/node-firefox-
debug
37
How
Imágenes para tests
●
kurento/node-chrome-beta
●
kurento/node-chrome-dev
●
kurento/node-firefox-beta
●
kurento/node-chrome-beta-debug
●
kurento/node-chrome-dev-debug
●
kurento/node-firefox-beta-debug
MIGRANDO CIA DOCKER
https://github.com/KurentoForks/docker-selenium
38
How
Orquestación...
●
Si conoces el número y tipo de contenedores a
priori → docker compose
●
En caso contrario → docker run
●
El nombre de todos los contenedores lleva como
prefijo el $BUILD_TAG de la ejecución del job
●
El workspace del job se monta como volumen
●
Todos los contenedores se paran y eliminan
termine el job con éxito o no (Post build step)
MIGRANDO CIA DOCKER
39
How
Orquestación...
●
Test de interfaz
– 1-5 browsers
– Escenario de test se ejecuta varias veces
●
Chrome
●
Firefox
●
…
MIGRANDO CIA DOCKER
40
How
Orquestación...
●
Integración de cliente Docker en los tests de
kurento-client
– Arrancar, parar contenedores
– Inspeccionar contenedores
– Recopilar logs
– Montar volúmenes
– Gestionar variables de entorno
MIGRANDO CIA DOCKER
41
How
Orquestación...
●
Topologías de red específicas
docker run --net=none …
– Todo contenedor presenta un namespace
docker inspect -f '{{.State.Pid}}' $container
– Se pueden montar topologías específicas
ln -s /proc/$pid/ns/net /var/run/netns/$pid-cont
ip netns list
MIGRANDO CIA DOCKER
42
How
MIGRANDO CIA DOCKER
43
How
Orquestación...
●
Topologías de red específicas
MIGRANDO CIA DOCKER
br0
NAT
192...172... 192...
docker0
44
How
Limpieza...
●
Por job
– Post build action
– Ejecuta siempre
– Devuelve el workspace a Jenkins (chown)
●
Evita https://issues.jenkins-ci.org/browse/JENKINS-24824
– Obtener contenedores asociados al job
●
docker ps -a | grep $BUILD_TAG | awk '{print $1}'
– Eliminar contenedores y sus volúmenes asociados
●
docker rm -v ...
MIGRANDO CIA DOCKER
45
How
Limpieza...
●
Una vez al día (en la nightly)
– Parar y borrar contenedores que estén todavía corriendo
– Eliminar imágenes huérfanas (dangling images)
docker images -f "dangling=true" -q
– Eliminar volúmenes huérfanos (dangling volumes)
docker volume ls -qf dangling=true
– Eliminar workspaces causados por el bug
https://issues.jenkins-ci.org/browse/JENKINS-24824
sudo -H find ~jenkins/workspace -name '*cleanup*' 
-type d -exec rm -rf {} ;
MIGRANDO CIA DOCKER
Migrando CI
a Docker
http://www.kurento.org
https://github.com/kurento
@kurentoms
Tribulaciones de un dev en
devops

Migrando CI a Docker