Remarque : Les exécuteurs hébergés sur GitHub ne sont pas pris en charge sur GitHub Enterprise Server. Vous pouvez voir plus d’informations sur le support futur planifié dans la GitHub public roadmap.
Introduction
Ce guide vous montre comment créer un workflow qui exécute une build Docker, puis publie des images Docker sur Docker Hub ou GitHub Packages. Avec un seul workflow, vous pouvez publier des images sur un registre unique ou sur plusieurs registres.
Remarque : Si vous souhaitez pousser des images vers un autre registre Docker tiers, l’exemple de la section « Publication d’images sur GitHub Packages » peut servir de modèle approprié.
Prérequis
Il est recommandé d’avoir une compréhension de base des options de configuration de workflows et de la création de fichiers de workflow. Pour plus d’informations, consultez « Découvrir GitHub Actions ».
Vous pouvez également trouver utile d’avoir une compréhension de base des éléments suivants :
- « Utilisation de secrets dans GitHub Actions »
- « Authentification par jeton automatique »
- "Utilisation du registre Docker"
À propos de la configuration d’une image
Ce guide suppose que vous disposez d’une définition complète pour une image Docker stockée dans un dépôt GitHub. Par exemple, votre dépôt doit contenir un Dockerfile et tous les autres fichiers nécessaires pour exécuter une build Docker pour créer une image.
Vous pouvez utiliser des clés d’annotation prédéfinies pour ajouter des métadonnées, notamment une description, une licence et un dépôt source, à votre image conteneur. Pour plus d’informations, consultez « Utilisation du registre de conteneurs ».
Dans ce guide, nous allons utiliser l’action Docker build-push-action
pour générer l’image Docker et la pousser vers un ou plusieurs registres Docker. Pour plus d’informations, consultez build-push-action
.
Remarque : GitHub Actions sur votre instance GitHub Enterprise Server peut avoir un accès limité aux actions sur GitHub.com ou GitHub Marketplace. Pour plus d’informations, consultez « Gestion de l’accès aux actions de GitHub.com » et contactez votre administrateur de site GitHub Enterprise.
Publication d’images sur Docker Hub
Chaque fois que vous créez une mise en production sur GitHub Enterprise Server, vous pouvez déclencher un workflow pour publier votre image. Le workflow dans l’exemple ci-dessous s’exécute quand l’événement release
se déclenche avec le type d’activité created
. Pour plus d’informations sur l’événement release
, consultez « Événements qui déclenchent des flux de travail ».
Dans l’exemple de workflow ci-dessous, nous utilisons les actions Docker login-action
et build-push-action
pour générer l’image Docker et, si la génération réussit, pousser l’image générée à Docker Hub.
Pour la pousser vers Docker Hub, vous devez disposer d’un compte Docker Hub et créer un dépôt Docker Hub. Pour plus d’informations, consultez « Envoi d’une image conteneur Docker à Docker Hub » dans la documentation Docker.
Les options login-action
requises pour Docker Hub sont les suivantes :
username
etpassword
: il s’agit de vos nom d’utilisateur et mot de passe Docker Hub. Nous vous recommandons de stocker vos nom d’utilisateur et mot de passe Docker Hub en tant que secrets afin qu’ils ne soient pas exposés dans votre fichier de workflow. Pour plus d’informations, consultez « Utilisation de secrets dans GitHub Actions ».
L’option metadata-action
requise pour Docker Hub est la suivante :
images
: espace de noms et nom de l’image Docker que vous générez/poussez sur Docker Hub.
Les options build-push-action
requises pour Docker Hub sont les suivantes :
tags
: étiquette de votre nouvelle image au formatDOCKER-HUB-NAMESPACE/DOCKER-HUB-REPOSITORY:VERSION
. Vous pouvez définir une étiquette unique comme indiqué ci-dessous ou spécifier plusieurs étiquettes dans une liste.push
: si la valeur esttrue
, l’image est envoyée au registre si elle est générée avec succès.
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub. # Elles sont fournies par un tiers et régies par # des conditions d’utilisation du service, une politique de confidentialité et un support distincts. # documentation en ligne. # GitHub recommande d’épingler les actions à un SHA de commit. # Pour obtenir une version plus récente, vous devez mettre à jour le SHA. # Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement. name: Publish Docker image on: release: types: [published] jobs: push_to_registry: name: Push Docker image to Docker Hub runs-on: [self-hosted] steps: - name: Check out the repo uses: actions/checkout@v4 - name: Log in to Docker Hub uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: my-docker-hub-namespace/my-docker-hub-repository - name: Build and push Docker image uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: . file: ./Dockerfile push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialité et un support distincts.
# documentation en ligne.
# GitHub recommande d’épingler les actions à un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: [self-hosted]
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: my-docker-hub-namespace/my-docker-hub-repository
- name: Build and push Docker image
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Le workflow ci-dessus extrait le dépôt GitHub, utilise login-action
pour se connecter au registre, puis l’action build-push-action
pour : générer une image Docker basée sur le Dockerfile
de votre dépôt, pousser l’image vers Docker Hub et appliquer une étiquette à l’image.
Publication d’images sur GitHub Packages
Remarque : Container registry est actuellement en version bêta pour GitHub Enterprise Server et susceptible d’être modifié.
GitHub Packages et l’isolation de sous-domaine doivent être activés pour utiliser Container registry. Pour plus d’informations, consultez « Utilisation du registre de conteneurs ».
Chaque fois que vous créez une mise en production sur GitHub Enterprise Server, vous pouvez déclencher un workflow pour publier votre image. Le workflow dans l’exemple ci-dessous s’exécute quand l’événement release
se déclenche avec le type d’activité created
. Pour plus d’informations sur l’événement release
, consultez « Événements qui déclenchent des flux de travail ».
Dans l’exemple de workflow ci-dessous, nous utilisons les actions Docker login-action
et build-push-action
pour générer l’image Docker et, si la génération réussit, pousser l’image générée vers GitHub Packages.
Les options login-action
requises pour GitHub Packages sont les suivantes :
registry
: doit être défini surcontainers.HOSTNAME
.username
: vous pouvez utiliser le contexte${{ github.actor }}
pour employer automatiquement le nom d’utilisateur de l’utilisateur qui a déclenché l’exécution du workflow. Pour plus d’informations, consultez « Contextes ».password
: vous pouvez utiliser le secretGITHUB_TOKEN
généré automatiquement pour le mot de passe. Pour plus d’informations, consultez « Authentification par jeton automatique ».
Les options build-push-action
requises pour GitHub Packages sont les suivantes :
-
push
: si la valeur esttrue
, l’image est envoyée au registre si elle est générée avec succès. -
tags
: doit être défini au formatcontainers.HOSTNAME/OWNER/REPOSITORY/IMAGE_NAME:VERSION
.Par exemple, pour une image nommée
octo-image
stockée sur GitHub Enterprise Server à l’adressehttps://HOSTNAME/octo-org/octo-repo
, l’optiontags
devrait être définie surcontainers.HOSTNAME/octo-org/octo-repo/octo-image:latest
. Vous pouvez définir une étiquette unique comme indiqué ci-dessous ou spécifier plusieurs étiquettes dans une liste.
Remarques :
- Ce workflow utilise des actions qui ne sont pas certifiées par GitHub. Elles sont fournies par un tiers et sont régies par des conditions d’utilisation du service, une politique de confidentialité et une documentation de support distinctes.
- GitHub recommande d’épingler les actions à un SHA de commit. Pour obtenir une version plus récente, vous devez mettre à jour le SHA. Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.
# name: Create and publish a Docker image # Configures this workflow to run every time a change is pushed to the branch called `release`. on: push: branches: ['release'] # Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds. env: REGISTRY: containers.HOSTNAME IMAGE_NAME: ${{ github.repository }} # There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu. jobs: build-and-push-image: runs-on: [self-hosted] # Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job. permissions: contents: read packages: write # steps: - name: Checkout repository uses: actions/checkout@v4 # Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here. - name: Log in to the Container registry uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels. - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} # This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages. # It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository. # It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step. - name: Build and push Docker image uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
name: Create and publish a Docker image
on:
push:
branches: ['release']
Configures this workflow to run every time a change is pushed to the branch called release
.
env:
REGISTRY: containers.HOSTNAME
IMAGE_NAME: ${{ github.repository }}
Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.
jobs:
build-and-push-image:
runs-on: [self-hosted]
There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
permissions:
contents: read
packages: write
Sets the permissions granted to the GITHUB_TOKEN
for the actions in this job.
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
Uses the docker/login-action
action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
This step uses docker/metadata-action to extract tags and labels that will be applied to the specified image. The id
"meta" allows the output of this step to be referenced in a subsequent step. The images
value provides the base name for the tags and labels.
- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
This step uses the docker/build-push-action
action to build the image, based on your repository's Dockerfile
. If the build succeeds, it pushes the image to GitHub Packages.
It uses the context
parameter to define the build's context as the set of files located in the specified path. For more information, see "Usage" in the README of the docker/build-push-action
repository.
It uses the tags
and labels
parameters to tag and label the image with the output from the "meta" step.
#
name: Create and publish a Docker image
# Configures this workflow to run every time a change is pushed to the branch called `release`.
on:
push:
branches: ['release']
# Defines two custom environment variables for the workflow. These are used for the Container registry domain, and a name for the Docker image that this workflow builds.
env:
REGISTRY: containers.HOSTNAME
IMAGE_NAME: ${{ github.repository }}
# There is a single job in this workflow. It's configured to run on the latest available version of Ubuntu.
jobs:
build-and-push-image:
runs-on: [self-hosted]
# Sets the permissions granted to the `GITHUB_TOKEN` for the actions in this job.
permissions:
contents: read
packages: write
#
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Uses the `docker/login-action` action to log in to the Container registry registry using the account and password that will publish the packages. Once published, the packages are scoped to the account defined here.
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
# This step uses [docker/metadata-action](https://github.com/docker/metadata-action#about) to extract tags and labels that will be applied to the specified image. The `id` "meta" allows the output of this step to be referenced in a subsequent step. The `images` value provides the base name for the tags and labels.
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
# This step uses the `docker/build-push-action` action to build the image, based on your repository's `Dockerfile`. If the build succeeds, it pushes the image to GitHub Packages.
# It uses the `context` parameter to define the build's context as the set of files located in the specified path. For more information, see "[Usage](https://github.com/docker/build-push-action#usage)" in the README of the `docker/build-push-action` repository.
# It uses the `tags` and `labels` parameters to tag and label the image with the output from the "meta" step.
- name: Build and push Docker image
uses: docker/build-push-action@f2a1d5e99d037542a71f64918e516c093c6f3fc4
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Le workflow ci-dessus est déclenché par une poussée vers la branche « release ». Il extrait le dépôt GitHub et utilise login-action
pour se connecter au Container registry. Il extrait ensuite les étiquettes et les intitulés pour l’image Docker. Enfin, il utilise l’action build-push-action
pour générer l’image et la publier sur le Container registry.
Publication d’images sur Docker Hub et GitHub Packages
Remarque : Container registry est actuellement en version bêta pour GitHub Enterprise Server et susceptible d’être modifié.
GitHub Packages et l’isolation de sous-domaine doivent être activés pour utiliser Container registry. Pour plus d’informations, consultez « Utilisation du registre de conteneurs ».
Dans un seul workflow, vous pouvez publier votre image Docker sur plusieurs registres à l’aide des actions login-action
et build-push-action
pour chaque registre.
L’exemple de workflow suivant utilise les étapes des sections précédentes (« Publication d’images sur Docker Hub » et « Publication d’images sur GitHub Packages ») pour créer un workflow unique qui envoie aux deux registres.
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub. # Elles sont fournies par un tiers et régies par # des conditions d’utilisation du service, une politique de confidentialité et un support distincts. # documentation en ligne. # GitHub recommande d’épingler les actions à un SHA de commit. # Pour obtenir une version plus récente, vous devez mettre à jour le SHA. # Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement. name: Publish Docker image on: release: types: [published] jobs: push_to_registries: name: Push Docker image to multiple registries runs-on: [self-hosted] permissions: packages: write contents: read steps: - name: Check out the repo uses: actions/checkout@v4 - name: Log in to Docker Hub uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Log in to the Container registry uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 with: registry: containers.HOSTNAME username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 with: images: | my-docker-hub-namespace/my-docker-hub-repository containers.HOSTNAME/${{ github.repository }} - name: Build and push Docker images uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions d’utilisation du service, une politique de confidentialité et un support distincts.
# documentation en ligne.
# GitHub recommande d’épingler les actions à un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez également référencer une balise ou une branche, mais l’action peut changer sans avertissement.
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registries:
name: Push Docker image to multiple registries
runs-on: [self-hosted]
permissions:
packages: write
contents: read
steps:
- name: Check out the repo
uses: actions/checkout@v4
- name: Log in to Docker Hub
uses: docker/login-action@f4ef78c080cd8ba55a85445d5b36e214a81df20a
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Log in to the Container registry
uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
with:
registry: containers.HOSTNAME
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
with:
images: |
my-docker-hub-namespace/my-docker-hub-repository
containers.HOSTNAME/${{ github.repository }}
- name: Build and push Docker images
uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
Le workflow ci-dessus extrait le dépôt GitHub Enterprise Server, utilise login-action
deux fois pour se connecter aux deux registres et génère des étiquettes et des intitulés avec l’action metadata-action
.
Ensuite, l’action build-push-action
génère et pousse l’image Docker vers Docker Hub et Container registry.