migrando ci a docker

46
Tribulaciones de un dev en devops Migrando CI a Docker Patxi Gortázar [email protected] @fgortazar

Upload: patxi-gortazar

Post on 23-Jan-2017

656 views

Category:

Software


1 download

TRANSCRIPT

Tribulaciones de un dev en devops

Migrando CIa Docker

Patxi Gortá[email protected]

@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 CI A DOCKER

4

Migrando CI a Docker

•Who

•What

•Why

• How

5

What

“Kurento is an Open Source Software WebRTC media server”

MIGRANDO CI A DOCKER

6

WhatMIGRANDO CI A DOCKER

https://webrtc.org

7

WhatMIGRANDO CI A DOCKER

8

WhatMIGRANDO CI A DOCKER

9

WhatMIGRANDO CI A DOCKER

10

WhatMIGRANDO CI A DOCKER

11

What

Kurento es...

• Media server

• APIs (clientes)

• Tutoriales

• Aplicaciones

MIGRANDO CI A DOCKER

12

WhatMIGRANDO 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

15

Migrando CI a Docker

•Who

•What

•Why

• How

16

Why

Infraestructura OpenStack

• 88 cpus

• 188GB memoria

• 3TB disco

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

20

Migrando CI a Docker

•Who

•What

•Why

• How

21

HowMIGRANDO 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

25

How

1 maestro

5 nodos iguales

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

29

How

Imágenes para builds

Imágenes para aplicaciones

Imágenes para tests

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

35

How

Imágenes para aplicaciones● Media server● Tutoriales● Demos

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

42

HowMIGRANDO 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