migrando ci a docker
TRANSCRIPT
3
Who
Devops en Kurento
Profesor en URJC
Haskeller aficionado
@fgortazar
https://es.linkedin.com/in/franciscogortazar
MIGRANDO CI A DOCKER
11
What
Kurento es...
• Media server
• APIs (clientes)
• Tutoriales
• Aplicaciones
MIGRANDO CI A 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 CI A 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 CI A DOCKER
17
Why
Para construir el media server:● 4 nodos Ubuntu Trusty● 2 nodos última release
Ubuntu● 2 nodos trusty (versión
estable anterior)
MIGRANDO CI A DOCKER
Para construir los clientes:● 4 nodos
Para infraestructura (Chef):● 1 nodo
18
WhyMIGRANDO CI A DOCKER
debrepo
Nightly buildchef-client
(Upgrades media serveron 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 CI A 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 CI A 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 CI A DOCKER
24
How
5 máquinas iguales
12 GB memoria
8 vCPUs
600 GB disco
Provisionadas con Chef Jenkins specifics + docker→
MIGRANDO CI A DOCKER
26
How
¿Dónde vas a poner tus imágenes (privadas)?● Dogestry: usar s3 como registro de imágenes
MIGRANDO CI A DOCKER
27
How
¿Dónde vas a poner tus imágenes (privadas)?● Dogestry: usar s3 como registro de imágenes
MIGRANDO CI A 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 CI A 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 CI A 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 CI A DOCKER
32
How
Matrices de versiones ● Ubuntu
– Ubuntu Trusty
– Ubuntu Wily
– Ubuntu Xenial
MIGRANDO CI A DOCKER
● JDK– JDK 7
– JDK 8
33
How
Imágenes para builds● Matriz configuración dev-integration
– JDK
– Maven
– Node
– Npm
– Bower
MIGRANDO CI A 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 CI A DOCKER
36
How
Imágenes para tests● selenium/hub● selenium/node-chrome● selenium/node-firefox
MIGRANDO CI A 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 CI A 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 CI A DOCKER
39
How
Orquestación...● Test de interfaz
– 1-5 browsers
– Escenario de test se ejecuta varias veces● Chrome● Firefox● …
MIGRANDO CI A 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 CI A 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 CI A DOCKER
43
How
Orquestación...● Topologías de red específicas
MIGRANDO CI A DOCKER
br0
NAT192...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 CI A 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 CI A DOCKER
Migrando CIa Docker
http://www.kurento.org https://github.com/kurento
@kurentoms
Tribulaciones de un dev en devops