Skip to main content

Création d’une action de conteneur Docker

Dans ce tutoriel, vous allez apprendre à générer une action de conteneur Docker.

Introduction

Dans ce guide, vous allez découvrir les composants de base qui sont nécessaires pour créer et utiliser une action de conteneur Docker empaquetée. Afin de nous concentrer sur les composants nécessaires à l’empaquetage de l’action, nous avons réduit la fonctionnalité du code de l’action à son strict minimum. L’action affiche « Hello World » dans les logs ou « Hello [who-to-greet] » si vous fournissez un nom personnalisé.

Une fois que vous aurez terminé ce projet, vous saurez comment créer votre propre action de conteneur Docker et la tester dans un workflow.

Les exécuteurs autohébergés doivent utiliser un système d’exploitation Linux et disposer de Docker pour exécuter les actions de conteneur Docker. Pour plus d’informations sur les impératifs des exécuteurs autohébergés, consultez Exécuteurs auto-hébergés.

Avertissement

Lors de la création de flux de travail et d’actions, vous devez toujours déterminer si votre code pourrait exécuter des entrées non fiables provenant de personnes malveillantes potentielles. Certains contextes doivent être traités comme des entrées non fiables, car un attaquant peut insérer son propre contenu malveillant. Pour plus d’informations, consultez « Informations de référence sur l’utilisation sécurisée ».

Prérequis

  • Vous devez créer un dépôt sur GitHub et le cloner sur votre station de travail. Pour plus d’informations, consultez « AUTOTITLE » et « AUTOTITLE ».
  • Si votre référentiel utilise Git LFS, vous devez inclure les objets dans les archives de votre dépôt. Pour plus d’informations, consultez « AUTOTITLE ».
  • Il peut être utile d'avoir des connaissances de base sur GitHub Actions, les variables d'environnement et le système de fichiers du conteneur Docker. Pour plus d’informations, consultez « AUTOTITLE » et « AUTOTITLE ».

Création d’un Dockerfile

Dans le nouveau répertoire , créez un fichier . Assurez-vous que le nom de votre fichier est correctement capitalisé (utilisez une majuscule pour la première lettre, mais pas pour les autres) si vous rencontrez des problèmes. Pour plus d’informations, consultez « AUTOTITLE ».

Dockerfile

Dockerfile
# Container image that runs your code
FROM alpine:3.10

# Copies your code file from your action repository to the filesystem path `/` of the container
COPY entrypoint.sh /entrypoint.sh

# Code file to execute when the docker container starts up (`entrypoint.sh`)
ENTRYPOINT ["/entrypoint.sh"]

Création d’un fichier de métadonnées d’action

Créez un fichier dans le répertoire que vous avez créé ci-dessus. Pour plus d’informations, consultez « AUTOTITLE ».

action.yml

YAML
# action.yml
name: 'Hello World'
description: 'Greet someone and record the time'
inputs:
  who-to-greet:  # id of input
    description: 'Who to greet'
    required: true
    default: 'World'
outputs:
  time: # id of output
    description: 'The time we greeted you'
runs:
  using: 'docker'
  image: 'Dockerfile'
  args:
    - ${{ inputs.who-to-greet }}

Ces métadonnées définissent une entrée et un paramètre de sortie . Pour passer des entrées au conteneur Docker, vous devez déclarer les entrées à l’aide de et les passer dans le mot clé . Tout ce que vous incluez est transmis au conteneur. Cependant, pour améliorer la découvrabilité de votre action par les utilisateurs, nous vous recommandons d'utiliser des paramètres.

GitHub crée une image à partir de votre et exécute les commandes dans un nouveau conteneur à l’aide de cette image.

Écriture du code d’action

Vous pouvez choisir n’importe quelle image Docker de base et, donc, n’importe quel langage pour votre action. L’exemple de script shell suivant utilise la variable d’entrée pour afficher « Hello [who-to-greet] » dans le fichier journal.

Ensuite, le script obtient l’heure actuelle et la définit comme une variable de sortie que pourront utiliser les prochaines actions d’un travail. Pour que GitHub reconnaisse les variables de sortie, vous devez les écrire dans le fichier d’environnement  : . Pour plus d’informations, consultez « AUTOTITLE ».

  1. Créez un nouveau fichier dans le répertoire.

  2. Ajoutez le code suivant à votre fichier .

    entrypoint.sh

    Shell
    #!/bin/sh -l
    
    echo "Hello $1"
    time=$(date)
    echo "time=$time" >> $GITHUB_OUTPUT
    
    

    Si s’exécute sans erreur, l’état de l’action est défini sur . Pour indiquer l’état d’une action, vous pouvez définir explicitement des codes de sortie dans le code de l’action. Pour plus d’informations, consultez « AUTOTITLE ».

  3. Rendez votre fichier exécutable. Git permet de modifier explicitement le mode d’autorisation d’un fichier afin qu’il ne soit pas réinitialisé chaque fois qu’il existe un clone/une duplication.

    Shell
    git add entrypoint.sh
    git update-index --chmod=+x entrypoint.sh
    
  4. Si vous le souhaitez, pour vérifier le mode d’autorisation du fichier dans l’index git, exécutez la commande suivante.

    Shell
    git ls-files --stage entrypoint.sh
    

    Une sortie semblable à signifie que le fichier possède l'autorisation d'exécution. Dans cet exemple, indique l’autorisation exécutable.

Création d’un fichier README

Pour expliquer aux utilisateurs comment utiliser votre action, vous pouvez créer un fichier README. Un fichier README est très utile si vous prévoyez de partager votre action publiquement, mais c’est aussi un excellent moyen de vous rappeler comment utiliser l’action.

Dans votre répertoire , créez un fichier qui spécifie les informations suivantes :

  • Une description détaillée de ce que fait l’action.
  • Les arguments d’entrée et de sortie obligatoires.
  • Les arguments d’entrée et de sortie facultatifs.
  • Les secrets utilisés par l’action.
  • Les variables d’environnement utilisées par l’action.
  • Un exemple d’utilisation de votre action dans un workflow.

README.md

Markdown
# Hello world docker action

This action prints "Hello World" or "Hello" + the name of a person to greet to the log.

## Inputs

## `who-to-greet`

**Required** The name of the person to greet. Default `"World"`.

## Outputs

## `time`

The time we greeted you.

## Example usage

uses: actions/hello-world-docker-action@v2
with:
  who-to-greet: 'Mona the Octocat'

Valider, baliser et envoyer votre action

À partir de votre terminal, commitez vos fichiers , , et .

Il est recommandé d’ajouter également une étiquette de version pour les versions de votre action. Pour plus d’informations sur le versioning de votre action, consultez « AUTOTITLE ».

Shell
git add action.yml entrypoint.sh Dockerfile README.md
git commit -m "My first action is ready"
git tag -a -m "My first action release" v1
git push --follow-tags

Tester votre action dans un workflow

Vous êtes maintenant prêt à tester votre action dans un workflow.

  • Lorsqu’une action se trouve dans un référentiel privé, vous pouvez contrôler qui peut y accéder. Pour plus d’informations, consultez « AUTOTITLE ».
  • Lorsqu’une action se trouve dans un référentiel interne, l’action ne peut être utilisée que dans les workflows du même référentiel.
  • Les actions publiques peuvent être utilisées par les workflows dans n’importe quel dépôt.

Exemple utilisant une action publique

Le code du flux de travail suivant utilise l'action "hello world" complétée dans le dépôt public. Copiez l’exemple de code de workflow suivant dans un fichier , en remplaçant par le nom de votre dépôt et le nom de votre action. Vous pouvez également remplacer l’entrée par votre nom. Les actions publiques peuvent être utilisées même si elles ne sont pas publiées dans GitHub Marketplace. Pour plus d’informations, consultez « AUTOTITLE ».

.github/workflows/main.yml

YAML
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      - name: Hello world action step
        id: hello
        uses: actions/hello-world-docker-action@v2
        with:
          who-to-greet: 'Mona the Octocat'
      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

Exemple utilisant une action privée

Copiez le code de l’exemple de workflow suivant dans un fichier du dépôt de votre action. Vous pouvez également remplacer l’entrée par votre nom. Cette action privée ne peut pas être publiée dans GitHub Marketplace, et ne peut être utilisée que dans ce dépôt.

.github/workflows/main.yml

YAML
on: [push]

jobs:
  hello_world_job:
    runs-on: ubuntu-latest
    name: A job to say hello
    steps:
      # To use this repository's private action,
      # you must check out the repository
      - name: Checkout
        uses: actions/checkout@v5
      - name: Hello world action step
        uses: ./ # Uses an action in the root directory
        id: hello
        with:
          who-to-greet: 'Mona the Octocat'
      # Use the output from the `hello` step
      - name: Get the output time
        run: echo "The time was ${{ steps.hello.outputs.time }}"

Dans votre dépôt, cliquez sur l’onglet Actions, puis sélectionnez la dernière exécution du workflow. Sous Travaux ou dans le graphe de visualisation, cliquez sur A job to say hello.

Cliquez sur Hello world action step et vous devriez voir « Hello Mona the Octocat » ou le nom que vous avez utilisé pour l’entrée who-to-greet imprimée dans le journal. Pour voir l’horodatage, cliquez sur Obtenir l’heure de la sortie.

Accès aux fichiers créés par une action de conteneur

Quand une action de conteneur s’exécute, elle mappe automatiquement le répertoire de travail par défaut () sur l’exécuteur avec l’annuaire du conteneur. Tous les fichiers ajoutés à cet annuaire sur le conteneur seront disponibles pour toutes les étapes suivantes du même projet. Par exemple, si vous disposez d’une action de conteneur qui génère votre projet et que vous souhaitez télécharger la sortie du build en tant qu’artefact, vous pouvez utiliser les étapes suivantes.

workflow.yml

YAML
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      # Output build artifacts to /github/workspace on the container.
      - name: Containerized Build
        uses: ./.github/actions/my-container-action

      - name: Upload Build Artifacts
        uses: actions/upload-artifact@v4
        with:
          name: workspace_artifacts
          path: ${{ github.workspace }}

Pour plus d’informations sur le chargement de la sortie du build en tant qu’artefact, consultez AUTOTITLE.

Exemples d’actions de conteneur Docker sur GitHub.com

Vous pouvez trouver de nombreux exemples d’actions de conteneur Docker sur GitHub.com.

  • github/indicateurs de problèmes (issue-metrics)
  • microsoft/infersharpaction
  • microsoft/ps-docs