El principal problema era que en cada ocasión tenía que instalar git en el contenedor descargado y posteriormente clonar el proyecto git con su rama correspondiente y lanzar manualmente el script. Dado que además quería probar el script en Debian 7 y 8 resultaba en que tenía que hacer muchas acciones manuales.
He tenido tiempo de sentarme a mirarlo con más detenimiento y resulta muy fácil crear una imagen personalizada partiendo de una base oficial como ubuntu o debian a la que posteriormente puedo añadir una serie de comandos personalizados para que agilice la ejecución.
El objetivo es que finalmente se me quede un único script en el que yo pueda ejecutar "probar-en [SO deseado] [direccion de la rama git que quiero probar]". En cada ocasión el contenedor será una imagen limpia de ubuntu/debian/raspbian que sólo tendrá instalado git.
Empezamos creando la imagen personalizada de Ubuntu 14.04 con los añadidos para ejecutar los tests. Lo hacemos en dos pasos:
- Crearmos un dockerfile, que especifica las características de la imagen que queremos crear y generándola
- Añadimos la funcionalidad para que descargue la rama y la ejecute
Creamos una carpeta específica para el proyecto y dentro de ella un archivo llamado "Dockerfile" con el siguiente contenido indicando cual es la imagen base que vamos a tomar y el añadido que le queremos ahcer
FROM ubuntu:14.04
RUN apt-get -y update && apt-get install -y git
Guardamos y generamos la imagen con
docker build -t ubuntu-14.04-git .
El nombre ubuntu-14.04-git será el nombre de la imagen que figurará en nuestros respositorio local. Una vez finaliza la ejecución podemos comprobar que se ha generado correctamente con:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-14.04-git latest d9adeb8df631 21 minutes ago 247.5 MB
Si accedemos a la imagen con "docker run -ti ubuntu-14.04-git /bin/bash" accederemos a la línea de comandos y podremos comprobar que es una imagen limpia con el git recien instalado.
Añadiendo el script de descarga y compilación
En mi caso quiero que el container este listo para que con un sólo comando se descargue un repositorio git y ejecute el script correspondiente. Así pues voy a crear un script de shell que haga todo eso para copiarlo dentro del container y que se ejecute al lanzarlo.
En mi caso quiero que el container este listo para que con un sólo comando se descargue un repositorio git y ejecute el script correspondiente. Así pues voy a crear un script de shell que haga todo eso para copiarlo dentro del container y que se ejecute al lanzarlo.
En la misma carpeta donde tenemos el Dockerfile añadimos un fichero llamado test-script.sh con el siguiente contenido:
#!/usr/bin/env bash
git clone $1
cd gphoto2-updater
./gphoto2-updater.sh
Como puedes ver es bastante obvio lo que hacer: recibe por parámetro una URL de un repositorio git, lo descarga, accede a la carpeta y lanza el comando.
Modificamos el Dockerfile con el siguiente contenido:
FROM ubuntu:14.04
RUN apt-get -y update && apt-get install -y git
COPY ./test-script.sh /
... y generamos de nuevo la imagen para que añada el fichero al sistema de archivos...
docker build -t ubuntu-14.04-git .
tardará sólo un momento y la imagen estará lista para trabajar. Cada vez que quiera probar una nueva rama de mi script basta con que lance:
docker run -rm -ti ubuntu-14.04-git /test-script.sh [URL de la rama GIT para probar]
...y tendré un container limpio de ubuntu 14.04 con el git instalado que directamente descargará la rama git indicada y lanzará el script de compilación. Una vez finalice saldrá y el flag rm borrará el container que se acababa de generar sin que queden rastros de la ejecución.
En mi caso he creado una alias para el comando anterior en el que reduzco el comando a
$test-ubuntu.sh [url proyecto git]
Partiendo de esta base es muy sencillo crear imágenes similares para debian 7 y 8 e incluso un script genérico para que lance los test sobre todos los SO que quiera.
Creando un dockerfile para cada SO
Muy sencillo, podemos crearlos todos en la misma carpeta añadiendo un sufijo al Dockerfile (como por ejemplo Dockerfile-debian-7) y luego personalizamos la llamada al docker build como sigue:
docker build -t debian-7-git -f Dockerfile-debian-7 .
Generará una imagen con la etiqueta debian-7-git. Ahora sí, revisando los alias puedo lanzar el testing de un rama GIT sobre un SO limpio con algo tan simple como:
$ ./test-os.sh debian-7-git https://github.com/gonzalo/gphoto2-updater.git
$ ./test-os.sh debian-8-git https://github.com/gonzalo/gphoto2-updater.git
$ ./test-os.sh ubuntu-14.04-git https://github.com/gonzalo/gphoto2-updater.git
$ ./test-os.sh raspbian-8-git https://github.com/gonzalo/gphoto2-updater.git
No hay comentarios:
Publicar un comentario