L’objectif

Utiliser Github Actions et Github container registry pour générer et héberger l’image Docker d’un projet hébergé sur Github.

Le contexte

Github propose depuis peu un service de “registry” pour héberger les images Docker. Ce service associé à Github Actions propose un workflow permettant d’automatiser la création d’une nouvelle image (lors d’une nouvelle version par exemple) et la mise à jour de l’image hébergée.

Proposer une image Docker pour un projet peut être un gros plus puisqu’il sera extrêmement simple de tester votre application sur un environnement Docker. Il suffira de télécharger l’image et de la lancer.

Mise en oeuvre

Le préalable indispensable est que votre projet dispose d’un Dockerfile qui va définir votre image Docker.

Il vous suffit ensuite de créer un fichier définissant les actions à accomplir dans le répertoire /.github/workflows/ de votre projet.

Voici le fichier .github/workflows/build-and-push-docker.yml que j’utilise :

name: Build and Push Docker Image

on:
  push:
    tags: [ 'v*.*.*' ]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Log in to the Container registry
        uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}

      - name: Build and push Docker image
        uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

Cette action va s’exécuter à chaque fois qu’un nouveau tag est créé sur votre projet.
Elle va générer une nouvelle image Docker et la mettre à jour sur le “container registry” Github.

Vous trouverez cette image dans la section “Packages” de votre projet ou de votre compte Github.
Par exemple, pour notre dernier petit projet, un générateur d’image openGraph l’image Docker générée est ici : https://github.com/craftpunks/og-image/pkgs/container/og-image