Publicar una imagen Docker con GitHub Actions
En el post anterior, desde un repositorio de GitHub se publicaba una web estática en un servicio de Azure, para ello, una GitHub Action se desencadenaba con cada commit que se realizaba en la rama master
. Como decíamos en ese post, GitHub Actions es la solución de GitHub para automatizar, personalizar y ejecutar workflows desde un repositorio de GitHub.
En este artículo vamos a crear una imagen docker y desplegarla en un repositorio público del Docker Hub.
Let's go
Antes de empezar, es necesario tener instaladas las herramientas de Docker. Una vez instalado y configurado, necesitaremos también para hacer este ejemplo GatsbyJS, en este artículo hacíamos un ejemplo sencillo de sitio estático empleando este framework.
# Install GatsbyJS
npm install -g gatsby-cli
# New Site
gatsby new DemoDockerActions https://github.com/gatsbyjs/gatsby-starter-default
# Go to folder
cd DemoDockerActions
Una vez completados los pasos anteriores, creamos un fichero .dockerignore
con el siguiente contenido:
.cache/
node_modules/
public/
A continuación, creamos el fichero Dockerfile
, con los pasos que queremos que se realicen cuando se construye la imagen. Básicamente, desde la imagen de Node, seleccionamos el directorio de trabajo, copiamos los ficheros que se han generado con la solución en los pasos anteriores, agregamos Gatsby-cli
, se instalan las dependencias, exponemos el puerto 8000 y le enviamos un cmd
para que genere el contenido estático en desarrollo.
FROM node:current-slim
WORKDIR /usr/src/app
COPY . .
RUN yarn global add gatsby-cli
RUN yarn install
EXPOSE 8000
CMD ["gatsby", "develop"]
Después, desde línea de comandos, agregamos y hacemos commit de los ficheros de nuestra solución y los consolidamos en el repositorio de git.
git init
git remote add origin https://github.com/rfcm83/DemoDockerActions.git
git pull
git add .
git commit -m 'First commit Demo Docker Actions'
git push origin master -f
Antes de crear una nueva Action, necesitamos crear un token para publicar en nuestro repositorio de imágenes en Docker hub. Para ello, accedemos a la configuración de cuenta en el menú Account Settings.
Después, en la sección Security, creamos un nuevo token y guardamos en un lugar seguro ese identificador.
Ya en el repositorio en GitHub, en la configuración del repo
agregamos un secreto con el token que hemos generado en el Docker Hub.
Tras crear el secreto con nuestro Access Token de Docker, vamos al menú Actions, y creamos directamente un nuevo workflow en blanco.
Automáticamente se crea un fichero yaml, y en él, establecemos un nombre para el workflow y agregamos este contenido:
name: Continuous Integration
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2.3.0
- name: Build and push Docker images
uses: docker/build-push-action@v1.1.0
with:
username: rfcm83
password: ${{ secrets.DOCKER_ACCESS_TOKEN }}
repository: rfcm83/demodockeractions
tags: latest
Al hacer el commit en la rama master
, se ejecutará automáticamente este workflow, y si todo va bien, cuando finalice habrá creado una nueva imagen en Docker Hub.
Let's try
En un terminal de PowerShell, lanzamos un nuevo contenedor con la imagen que hemos creado, y lo ejecutamos en el puerto 8888.
docker run -p 8888:8000 rfcm83/demodockeractions
Una vez complete la descarga de la imagen y levante el contenedor, si accedemos en un navegador a localhost:8888, podemos ver una instancia de Gatsby Default Starter.
Para salir de la ejecución, pulsamos Ctrl + C en el terminal de PowerShell, listamos los contenedores que están en uso y detenemos el que hemos levantado.