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.
-
Téléchargez et installez Node.js. 20.x, qui inclut npm.
-
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 ».
-
Clonez votre dĂ©pĂŽt sur votre ordinateur. Pour plus dâinformations, consultez « Clonage dâun dĂ©pĂŽt ».
-
à partir de votre terminal, remplacez les répertoires par votre nouveau dépÎt.
Shell cd hello-world-javascript-action
cd hello-world-javascript-action
-
à partir de votre terminal, initialisez le répertoire avec npm pour générer un fichier
package.json
.Shell npm init -y
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 ».
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
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.
npm install @actions/core @actions/github
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.
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); }
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.
# 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 ```
# 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.
-
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
-
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;
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;
-
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. -
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
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.
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 }}"
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.
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 }}"
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.