Este documento describe la migración de un sistema de integración continua (CI) desde máquinas virtuales a contenedores Docker. Explica las deficiencias del sistema original, como la gestión compleja de configuraciones y versiones. Luego detalla el enfoque de migrar los jobs de CI, imágenes y orquestación a Docker para mejorar la portabilidad, escalabilidad y mantenimiento.
19. 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
22. 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. 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. 24
How
5 máquinas iguales
12 GB memoria
8 vCPUs
600 GB disco
Provisionadas con Chef Jenkins specifics + docker→
MIGRANDO CIA DOCKER
30. 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. 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
34. 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
38. 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
40. 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. 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
44. 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. 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