SetValue.NETSetValue.NET

Publicar una imagen Docker con GitHub Actions

June 16, 2020

Generic badge

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.

Docker Hub

Después, en la sección Security, creamos un nuevo token y guardamos en un lugar seguro ese identificador.

Docker Hub

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.

Docker Hub

Tras crear el secreto con nuestro Access Token de Docker, vamos al menú Actions, y creamos directamente un nuevo workflow en blanco.

GitHub Actions

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.

GitHub Actions

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

PowerShell Docker

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.

Gatsby from Docker

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.

Docker Stop

Buy Me A Coffee