Publicar imágenes de Docker en GitHub Packages desde GitHub Actions

En un artículo anterior te conté que puedes publicar tus imágenes de Docker en GitHub Packages, para que esta formara parte de tu repositorio en GitHub. Sin embargo, mostré cuales eran los pasos de forma manual, cuando lo ideal sería que fuera un proceso automatizado. Hoy quiero contarte cómo llevarlo a cabo con GitHub Actions.

El flujo

Utilizando el mismo repositorio que te mostré ayer, hello-devops, he añadido el siguiente flujo para automatizar la creación y la publicación de la imagen:

name: CI

# Controls when the action will run.
on:
  # Triggers the workflow on push events but only for the main branch
  push:
    branches: [main]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

#Enviroment variables that you can use in the steps
env:
  IMAGE_NAME: hello-devops

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  build_and_push_to_registry:
    name: Build and push Docker image to GitHub Packages
    runs-on: ubuntu-latest
    steps:
      - name: Check out the repo
        uses: actions/[email protected]
      - name: Login to GitHub Packages
        uses: docker/[email protected]
        with:
          registry: docker.pkg.github.com
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Lowercase repository name
        run: |
          echo "REPO=${GITHUB_REPOSITORY,,}" >> $GITHUB_ENV
      - name: Short the sha to 7 characters only
        id: vars
        run: echo ::set-output name=tag::$(echo ${GITHUB_SHA::7})
      - name: Build and push to GitHub Packages
        uses: docker/[email protected]
        with:
          context: .
          file: ./Dockerfile
          push: true
          tags: docker.pkg.github.com/${{ env.REPO }}/${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.tag }}

Este flujo hace básicamente lo siguiente:

  1. Hace checkout del código fuente del repositorio donde se lanza el flujo.
  2. Inicia sesión en docker.pkg.github.com como hice en el artículo anterior. Sin embargo, en este caso no es necesario generar un Personal Access Token sino que podemos utilizar el que viene en GITHUB_TOKEN. Si quisiéramos publicar en GitHub Container Registry en lugar de GitHub Packages deberías de habilitar la preview, cambiar el inicio de sesión a ghcr.io y en este caso si sería necesario utilizar un PAT como se comenta en el artículo.
  3. Pone en minúsculas el nombre del repositorio. Esto es necesario porque si hay alguna mayúscula en el nombre, al intentar hacer el push, te dará error si no lo corriges antes.
  4. Como tag de mi imagen he elegido utilizar el SHA que proporciona GitHub con cada commit. Sin embargo, como esta cadena es muy larga me he quedado solo con los 7 primeros caracteres de la misma.
  5. Por último, en el último paso se creará la imagen y posteriormente se publicará con el tag que hemos definido, que en este ejemplo hace uso de la variable de entorno REPO, que está en minúsculas, y el output llamado tag del paso llamado vars, para que puedas ver dos formas de compartir información entre steps 🙂

¡Saludos!

logo lemoncode

Bootcamp Devops

Si tienes ganas de meterte en el área de Devops, formo parte del equipo de docentes del Bootcamp Devops Lemoncode, ¿Te animas a aprender con nosotros?

Más Info