En esta ocasión, vamos a explorar el servicio GitHub Actions. Se trata de un servicio de CI que nos ofrece GitHub de forma gratuita. La ventaja de usar este servicio es que nuestro código queda integrado con nuestro CI y puede interactuar directamente con otras funciones de GitHub.

En este caso, empezaremos explorando los conceptos básicos para el uso de esta herramienta y veremos cómo publicar nuestras imágenes de Docker en el registry de Docker.io.

Conceptos básicos de GitHub Actions

GitHub Actions usa lo que se define como workflows. Un workflow es un proceso automatizado configurable formado por uno o más trabajos. Cada workflow se compone, como mínimo, de dos secciones:

  • Triggers: Usando la palabra reservada on, definimos los eventos en los que un workflow se debe ejecutar. Por ejemplo, por cada commit sobre una rama, por cada pull-request, cada vez 5 minutos, etc. Accede aquí para consultar todas las posibilidades.
  • Jobs: Usando la palabra reservada jobs, indicamos lo que queremos ejecutar, donde lo queremos ejecutar, dependencias con otros jobs, etc. Cada job se compone de steps, es decir, módulos o acciones que componen el job y que se ejecutarán secuencialmente. Accede aquí para consultar el catálogo de acciones que se pueden usar.

Workflow “Hello World”

Lo primero que tenemos que hacer es crear el directorio .github/workflows/ en la raiz de nuestro repositorio. Todos los ficheros con extensión .yml serán procesados automáticamente por GitHub. Veamos un ejemplo:

Podemos hacer las siguientes observaciones:

  • Triggers: Se ejecutará cuando se realice un push sobre la rama helloworldbranch o cuando lo lancemos a mano.
  • Jobs: solo tenemos un job llamado my_hello_world_job. En el primer step, nos descargamos el repositorio y, en el segundo step, ejecutamos comandos.
Veamos nuestro workflow en acción:
$ git checkout -b helloworldbranch
$ git add .
$ git commit -m 'Workflow Hello World'
$ git push origin helloworldbranch

Nada más subir el cambio, vemos que en GitHub se ha ejecutado el workflow:

Uso de GitHub Actions para contruir y publicar imágenes de Docker

Ya hemos visto cómo podemos crear un workflow para hacer tareas automatizadas. Una tarea muy común es construir imágenes de Docker y subirlas a un registry. Supongamos que la imagen que queremos a construir se basa en el siguiente Dockerfile:

FROM python:3-slim
RUN mkdir /app && echo '<h1>Hello World!</h1>' > /app/index.html
WORKDIR /app
EXPOSE 8000
ENTRYPOINT [ "python3", "-m", "http.server", "8000" ]
Para la construcción y publicación de esta imagen, usaremos las siguientes acciones:
  • actions/checkout@v2: Nos permitirá descargar el código en el runner de GitHub Actions.
  • docker/login-action@v1: Lo usaremos para autenticarnos en el registry. Por defecto, se usa el registry de Docker.io, pero podemos indicar otro registry.
  • docker/build-push-action@v2: Nos permitirá construir la imagen y publicarla en el registry.

Adicionalmente, la versión v2 de la acción build-push-action usa buildx por lo que debemos ejecutar en steps previos dos dependencias (se indica en la documentación):

  • docker/setup-qemu-action@v1
  • docker/setup-buildx-action@v1

Con todo esto, nuestro workflow quedaría del siguiente modo:

Una vez subidos los secretos DOCKERHUB_USERNAME y DOCKERHUB_TOKEN al repositorio para la autenticación en el registry, podemos subir los cambios a la rama main. En este momento es cuando vemos que se ha ejecutado el workflow correspondiente al trigger de la rama main y que ha provocado la subida a Docker.io la imagen con la tag latest, como definimos para la rama main:

Ahora, si ponemos la tag v0.0.1 en el último commit (puntero HEAD), podemos ver que el workflow nos ha generado la imagen correspondiente a esa tag:

$ git tag v0.0.1 HEAD
$ git push --tags

Conclusiones

Existen múltiples herramientas de CI como pueden ser Jenkins, TravisCI, CircleCI, etc. Sin embargo, estas herramientas están conceptualmente separadas del código. La gran ventaja de tener el entorno de CI integrado con los repositorios es la gran versatilidad que tenemos a la hora de gestionar triggers, interactuar con issues y pull requests, etc.

Además, otra de las grandes ventajas de usar GitHub Actions es la cantidad de acciones que tenemos a nuestra disposición en el Marketplace para simplificar la sintaxis de nuestros workflows.

Como resumen, GitHub Actions es una solución de CI gratuita (hasta ciertos límites), se puede usar sin necesidad de tener infraestructura propia, con un abundante catálogo de acciones y con una gran integración con tus repositorios de GitHub. ¿Qué razón hay para no usarlo?

Álvaro Torres Cogollo.

¿Quieres contactar conmigo? Te dejo mis redes sociales a continuación.