Skip to main content

Creating a JavaScript action

Dans ce tutoriel, vous apprendrez à créer une action JavaScript à l'aide de la boßte à outils Actions.

Introduction

Dans ce guide, vous allez dĂ©couvrir les composants de base qui sont nĂ©cessaires pour crĂ©er et utiliser une action JavaScript 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 journaux ou « Hello [who-to-greet] Â» si vous fournissez un nom personnalisĂ©.

Ce guide utilise le module Node.js du kit de ressources GitHub Actions pour accĂ©lĂ©rer le dĂ©veloppement. Pour plus d’informations, consultez le dĂ©pĂŽt actions/toolkit.

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

Pour garantir la compatibilitĂ© de vos actions JavaScript avec tous les exĂ©cuteurs hĂ©bergĂ©s sur GitHub (Ubuntu, Windows et macOS), le code JavaScript packagĂ© que vous Ă©crivez doit ĂȘtre du code JavaScript pur et ne doit pas dĂ©pendre d’autres fichiers binaires. Les actions JavaScript s’exĂ©cutent directement sur l’exĂ©cuteur et utilisent des fichiers binaires qui existent dĂ©jĂ  dans l’image de l’exĂ©cuteur.

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

Avant de commencer, vous devez télécharger Node.js et créer un dépÎt public GitHub.

  1. Téléchargez et installez Node.js. 20.x, qui inclut npm.

    https://nodejs.org/en/download/

  2. CrĂ©ez un dĂ©pĂŽt public sur GitHub et appelez-le « hello-world-javascript-action Â». Pour plus d’informations, consultez « CrĂ©ation d’un dĂ©pĂŽt Â».

  3. Clonez votre dĂ©pĂŽt sur votre ordinateur. Pour plus d’informations, consultez « Clonage d’un dĂ©pĂŽt Â».

  4. À partir de votre terminal, remplacez les rĂ©pertoires par votre nouveau dĂ©pĂŽt.

    Shell
    cd hello-world-javascript-action
    
  5. À partir de votre terminal, initialisez le rĂ©pertoire avec npm pour gĂ©nĂ©rer un fichier package.json.

    Shell
    npm init -y
    

CrĂ©ation d’un fichier de mĂ©tadonnĂ©es d’action

CrĂ©ez un fichier nommĂ© action.yml dans le rĂ©pertoire hello-world-javascript-action avec l’exemple de code suivant. Pour plus d’informations, consultez « RĂ©fĂ©rence syntaxique des mĂ©tadonnĂ©es Â».

YAML
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: node20
  main: dist/index.js

Ce fichier dĂ©finit l’entrĂ©e who-to-greet et la sortietime. Il indique Ă©galement Ă  l’exĂ©cuteur d’actions comment exĂ©cuter cette action JavaScript.

Ajout de packages de kit de ressources d’actions

Le kit de ressources d’actions est une collection de packages Node.js qui vous permet de crĂ©er rapidement des actions JavaScript avec plus de cohĂ©rence.

Le package @actions/core du kit de ressources fournit une interface aux commandes de workflow, aux variables d’entrĂ©e et de sortie, aux Ă©tats de sortie et aux messages de dĂ©bogage.

Le kit de ressources offre également un package @actions/github qui retourne un client REST Octokit authentifié et un accÚs aux contextes GitHub Actions.

Le kit de ressources offre plus que les packages core et github. Pour plus d’informations, consultez le dĂ©pĂŽt actions/toolkit.

À partir de votre terminal, installez les packages core et github du kit de ressources d’actions.

Shell
npm install @actions/core @actions/github

Vous devriez maintenant voir un répertoire node_modules et un fichier package-lock.json qui suivent toutes les dépendances installées ainsi que leurs versions. Vous ne devez pas commiter le répertoire node_modules dans votre référentiel.

Écriture du code d’action

Cette action utilise le kit de ressources pour obtenir la variable d’entrĂ©e who-to-greet nĂ©cessaire dans le fichier de mĂ©tadonnĂ©es de l’action, et affiche « Hello [who-to-greet] Â» dans un message de dĂ©bogage dans le 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.

GitHub Actions fournit des informations contextuelles sur l’évĂ©nement webhook, les rĂ©fĂ©rences Git, le workflow, l’action et la personne qui a dĂ©clenchĂ© le workflow. Pour accĂ©der aux informations de contexte, vous pouvez utiliser le package github. L’action que vous allez Ă©crire affiche la charge utile de l’évĂ©nement webhook dans le journal.

Ajoutez un fichier nommé src/index.js en utilisant le code suivant.

JavaScript
import * as core from "@actions/core";
import * as github from "@actions/github";

try {
  // `who-to-greet` input defined in action metadata file
  const nameToGreet = core.getInput("who-to-greet");
  core.info(`Hello ${nameToGreet}!`);

  // Get the current time and set it as an output variable
  const time = new Date().toTimeString();
  core.setOutput("time", time);

  // Get the JSON webhook payload for the event that triggered the workflow
  const payload = JSON.stringify(github.context.payload, undefined, 2);
  core.info(`The event payload: ${payload}`);
} catch (error) {
  core.setFailed(error.message);
}

Si une erreur est levĂ©e dans l’exemple index.js ci-dessus, core.setFailed(error.message); utilise le package @actions/core du kit de ressources d’actions pour journaliser un message et dĂ©finir un code de sortie d’échec. Pour plus d’informations, consultez « Setting exit codes for actions Â».

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 hello-world-javascript-action, crĂ©ez un fichier README.md 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.
Markdown
# Hello world JavaScript 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

```yaml
uses: actions/hello-world-javascript-action@e76147da8e5c81eaf017dede5645551d4b94427b
with:
  who-to-greet: Mona the Octocat
```

Engagez, marquez et poussez votre action

GitHub télécharge chaque action exécutée dans un flux de travail pendant la durée d'exécution et l'exécute comme un ensemble complet de code avant que vous puissiez utiliser des commandes de flux de travail comme run pour interagir avec la machine d'exécution. Cela signifie que vous devez inclure toutes les dépendances de package qui sont nécessaires pour exécuter le code JavaScript. Par exemple, cette action utilise les packages @actions/core et @actions/github.

Le check-in de votre répertoire node_modules peut entraßner des problÚmes. Vous pouvez également utiliser des outils tels que rollup.js ou @vercel/ncc pour regrouper votre code et ses dépendances dans un seul fichier à distribuer.

  1. Installez rollup et ses plugins en exécutant cette commande dans votre terminal.

    npm install --save-dev rollup @rollup/plugin-commonjs @rollup/plugin-node-resolve

  2. Créez un nouveau fichier nommé rollup.config.js à la racine de votre référentiel avec le code suivant.

    JavaScript
    import commonjs from "@rollup/plugin-commonjs";
    import { nodeResolve } from "@rollup/plugin-node-resolve";
    
    const config = {
      input: "src/index.js",
      output: {
        esModule: true,
        file: "dist/index.js",
        format: "es",
        sourcemap: true,
      },
      plugins: [commonjs(), nodeResolve({ preferBuiltins: true })],
    };
    
    export default config;
    
  3. Compilez votre fichier dist/index.js.

    rollup --config rollup.config.js

    Vous verrez un nouveau fichier dist/index.js contenant votre code et toutes les dépendances.

  4. Depuis votre terminal, commiter les mises Ă  jour.

    Shell
    git add src/index.js dist/index.js rollup.config.js package.json package-lock.json README.md action.yml
    git commit -m "Initial commit of my first action"
    git tag -a -m "My first action release" v1.1
    git push --follow-tags
    

Lorsque vous commitez et envoyez (push) votre code, votre rĂ©fĂ©rentiel mis Ă  jour devrait ressembler Ă  ceci :

hello-world-javascript-action/
├── action.yml
├── dist/
│   └── index.js
├── package.json
├── package-lock.json
├── README.md
├── rollup.config.js
└── src/
    └── index.js

Tester votre action dans un workflow

Vous ĂȘtes maintenant prĂȘt Ă  tester votre action dans un workflow.

Les actions publiques peuvent ĂȘtre utilisĂ©es par les workflows dans n’importe quel dĂ©pĂŽt. Lorsqu’une action se trouve dans un rĂ©fĂ©rentiel privĂ©, les paramĂštres du rĂ©fĂ©rentiel dĂ©terminent si l’action est disponible uniquement dans le mĂȘme rĂ©fĂ©rentiel ou Ă©galement dans d’autres rĂ©fĂ©rentiels appartenant aux mĂȘmes utilisateur ou organisation. Pour plus d’informations, consultez « Gestion des paramĂštres de GitHub Actions pour un dĂ©pĂŽt Â».

Exemple utilisant une action publique

Cet exemple montre comment votre nouvelle action publique peut ĂȘtre exĂ©cutĂ©e Ă  partir d’un dĂ©pĂŽt externe.

Copiez le code YAML suivant dans un nouveau fichier Ă  l’emplacement .github/workflows/main.yml, puis mettez Ă  jour la ligne uses: octocat/hello-world-javascript-action@1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b avec votre nom d’utilisateur et le nom du dĂ©pĂŽt public que vous avez créé ci-dessus. Vous pouvez Ă©galement remplacer l’entrĂ©e who-to-greet par votre nom.

YAML
on:
  push:
    branches:
      - main

jobs:
  hello_world_job:
    name: A job to say hello
    runs-on: ubuntu-latest

    steps:
      - name: Hello world action step
        id: hello
        uses: octocat/hello-world-javascript-action@1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b
        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 }}"

Lorsque ce workflow sera dĂ©clenchĂ©, l’exĂ©cuteur tĂ©lĂ©chargera l’action hello-world-javascript-action Ă  partir de votre dĂ©pĂŽt public, puis l’exĂ©cutera.

Exemple utilisant une action privée

Copiez le code du workflow dans un fichier .github/workflows/main.yml du dĂ©pĂŽt de votre action. Vous pouvez Ă©galement remplacer l’entrĂ©e who-to-greet par votre nom.

YAML
on:
  push:
    branches:
      - main

jobs:
  hello_world_job:
    name: A job to say hello
    runs-on: ubuntu-latest

    steps:
      # To use this repository's private action,
      # you must check out the repository
      - name: Checkout
        uses: actions/checkout@v4

      - 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.

DépÎts de modÚles pour créer des actions JavaScript

GitHub fournit des dĂ©pĂŽts de modĂšles pour crĂ©er des actions JavaScript et TypeScript. Vous pouvez utiliser ces modĂšles pour commencer rapidement Ă  crĂ©er une action qui inclut des tests, un linting et d’autres pratiques recommandĂ©es.

Exemples d’actions JavaScript sur GitHub.com

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