import { Steps } from "@astrojs/starlight/components"
import { FileTree } from "@astrojs/starlight/components"

[GitHub Actions](https://docs.github.com/en/actions) est une plateforme d'intégration continue et de livraison continue (CI/CD) qui vous permet d'automatiser votre pipeline de construction, de test et de déploiement. Vous pouvez créer des workflows qui construisent et testent chaque pull request vers votre dépôt, ou déployer les pull requests fusionnées en production.

[Dernièrement](https://github.blog/changelog/2025-04-14-github-actions-token-integration-now-generally-available-in-github-models/), GitHub a également ajouté la possibilité d'utiliser les [GitHub Models](https://docs.github.com/en/github-models) dans les actions.

La combinaison d'Actions et de Models vous permet d'exécuter GenAIScript dans le cadre de votre CI/CD.

:::tip
Passez à la section [Actions personnalisées](#custom-actions) pour apprendre comment empaqueter un script GenAIScript en tant qu'action GitHub.
:::

## Exemples

* [Étiqueteur d'issues GenAI](https://github.com/pelikhan/action-genai-issue-labeller/)
* [Dédupliqueur d'issues GenAI](https://github.com/pelikhan/action-genai-issue-dedup/)
* [Analyseur vidéo d'issues GenAI](https://github.com/pelikhan/action-genai-video-issue-analyzer/)
* [Commentateur de code GenAI](https://github.com/pelikhan/action-genai-commentor/)

## Permissions GitHub Models

[Pour utiliser les Models dans une action GitHub](https://docs.github.com/en/github-models/use-github-models/integrating-ai-models-into-your-development-workflow#using-ai-models-with-github-actions), vous devez définir les `permissions` de l'action pour inclure `models: read`.

```yaml "models: read"
permissions:
    models: read
```

GenAIScript supporte nativement les GitHub Models, vous pouvez donc l'utiliser directement dans votre workflow GitHub Actions.

## Utilisation de la CLI

La façon la plus simple d'utiliser GenAIScript dans une action GitHub est d'exécuter directement la [CLI](/genaiscript/reference/cli). Vous pouvez le faire en ajoutant une étape dans votre workflow qui exécute la commande `genaiscript`.

```yaml "npx -y genaiscript run ..."
- uses: actions/setup-node@v4 # make sure node.js is installed
- name: Run GenAIScript
  run: npx -y genaiscript run ...
  env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

**Assurez-vous d'inclure le `GITHUB_TOKEN` dans les variables d'environnement** afin que GenAIScript puisse s'authentifier auprès des GitHub Models.

```yaml "GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}"
---
run: npx -y genaiscript run ...
env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

## Actions personnalisées <a id="custom-actions" />

GitHub supporte le packaging des tâches sous forme d'[actions personnalisées](https://docs.github.com/en/actions/sharing-automations/creating-actions/about-custom-actions), généralement dans un dépôt dédié. C’est un excellent moyen d'empaqueter un script IA et de le partager avec d'autres.

```yaml "uses: <owner>/<repo>@<tag>"
- name: Run AI Script
  uses: <owner>/<repo>@<tag>
  with:
      github_token: ${{ secrets.GITHUB_TOKEN }}
```

La CLI GenAIScript fournit une commande pour générer/mettre à jour le code standard afin d'empaqueter un script sous forme d’une [action conteneur Docker](https://docs.github.com/en/actions/sharing-automations/creating-actions/creating-a-docker-container-action), ce qui permet de l'utiliser dans GitHub Actions quel que soit le langage utilisé pour écrire le script.

Pour commencer,

<Steps>
  <ol>
    <li>
      Créez un nouveau dépôt pour votre action.
    </li>

    <li>
      Ouvrez un terminal à la racine de votre dépôt.
    </li>

    <li>
      Exécutez la commande pour générer le squelette de l’action :

      ```bash
      npx -y genaiscript configure action
      ```
    </li>
  </ol>
</Steps>

Le générateur de squelette d’action va écraser les fichiers suivants :

<FileTree>
  * `action.yml` Fichier des métadonnées de l'action
  * `Dockerfile` Dockerfile pour l'action
  * `README.md` Documentation pour l'action
  * `.gitignore` Fichiers à ignorer dans le dépôt
  * `.github/workflows/ci.yml` Workflow CI pour tester l'action
  * `package.json` Configuration du package pour l'action
  * `devcontainer/devcontainer.json` Configuration du devcontainer pour VS Code
  * `devcontainer/Dockerfile` Dockerfile du devcontainer pour VS Code. Doit être synchronisé avec le Dockerfile de l'action.
</FileTree>

Pour mettre à jour le squelette de l’action, vous pouvez relancer la même commande :

```bash
npm run configure
```

### Métadonnées

Le fichier `action.yml` contient les métadonnées de l’action. Elles sont extraites de différentes parties de votre projet :

* Le `name` est dérivé de l’identifiant du script.
* La `description` est dérivée du `title` du script.
* Les `inputs` sont dérivés des [paramètres](/genaiscript/reference/scripts/parameters) du script (voir ci-dessous).

Notez que la `script.description` est utilisée pour remplir le fichier `README.md`.

### Entrées

La section `inputs` du fichier `action.yml` est générée automatiquement à partir des paramètres du script.
Chaque paramètre est converti en une entrée (input) portant le même nom, et le type est inféré à partir du type du paramètre.

```js title="poem.genai.mts"
script({
    title: "A poem generator",
    accept: "none",
    parameters: {
        topic: "nature"
    }
})
$`Write a poem about ${env.vars.topic}`.
```

Le fichier `action.yml` généré ressemblera à ceci :

```yaml title="action.yml"
name: poem
description: Write a poem about nature
inputs:
    topic:
        description: The topic of the poem
        required: false
        default: nature
```

Il existe aussi des champs additionnels communs à toutes les actions GenAIScript :

* `files` : Spécifie un chemin de fichier pour alimenter la variable `env.files`. Pour retirer ce champ, mettez `accept: "none"` dans le script.
* `github_token` : **Cela est requis pour s'authentifier auprès des GitHub Models.**\
  Il deviendra `INPUT_GITHUB_TOKEN` lorsque le conteneur sera créé et GenAIScript le détectera automatiquement.
* `github_issue` : Le numéro actuel de l’issue ou de la pull request GitHub.
* `debug` : Le filtre pour contrôler les messages de [logging](/genaiscript/reference/scripts/logging) de débogage.

### Sorties

L’action remplit quelques champs de sortie.

* `text` : le texte généré par le script.
* `data` : la structure de sortie analysée et convertie en chaîne JSON. Ce champ est rempli si vous fournissez un [responseSchema](/genaiscript/reference/scripts/schemas) dans le script et si le LLM peut générer une réponse conforme au schéma.

### Branding

Le champ `branding` du `script` est utilisé pour [personnaliser l'apparence de l'action dans l'interface GitHub](https://docs.github.com/en/actions/sharing-automations/creating-actions/metadata-syntax-for-github-actions?versionId=free-pro-team%40latest\&productId=actions\&restPage=sharing-automations%2Ccreating-actions%2Creleasing-and-maintaining-actions#branding).

```js
script({
    branding: {
        icon: "pencil",
        color: "blue",
    },
})
```

### Conteneurs

Par défaut, GenAIScript utilise [node:lts-alpine](https://hub.docker.com/_/node/) comme image de base pour le conteneur de l'action.\
Vous pouvez changer cela en spécifiant une autre image de base dans la `cli`.

```dockerfile "--image <image>"
npx -y genaiscript configure action ... --image <image>
```

GenAIScript créera également un [devcontainer](https://code.visualstudio.com/docs/devcontainers/create-dev-container) afin que vous puissiez développer l’action dans un environnement conteneurisé (presque identique) à celui où elle s’exécute dans GitHub Action.

### ffmpeg, playwright et autres paquets

Pour garder le conteneur d’action léger, GenAIScript n’inclut pas `ffmpeg`, `playwright` ni d’autres paquets par défaut.\
Vous pouvez les ajouter au conteneur en les spécifiant dans la commande de la `cli`.

```bash "--ffmpeg --playwright"
npx -y genaiscript configure action ... --ffmpeg --playwright
```

Vous pouvez également ajouter tous les autres paquets nécessaires en les indiquant dans la commande `cli`.

```bash "--apks <package1> <package2>"
npx -y genaiscript configure action ... --apks <package1> <package2>
```

### Tests de l’Action

Votre script devrait être testable localement en utilisant la commande `npm run dev`. N’hésitez pas à la modifier dans `package.json`.

```bash
npm run dev
```

Ou si vous souhaitez simuler l’environnement GitHub Action, vous pouvez définir les variables `INPUT_<paramètre>` dans l’environnement.

```bash
INPUT_TOPIC=nature genaiscript run poem
```

### Workspace GitHub vs Workspace Action

Lors de l’exécution de l’action dans un conteneur, le contenu du dépôt de l’action est d’abord copié dans le répertoire `/github/action`. GitHub clone le dépôt dans le répertoire `/github/workspace`.

Le `ENTRYPOINT` du `Dockerfile` est configuré pour lancer la CLI `genaiscript` dans le répertoire `/github/action`, puis il détecte la variable d’environnement `GITHUB_WORKSPACE` pour déterminer le répertoire de travail et change le `cwd` en conséquence.

Ce mode est activé par l’option `--github-workspace` dans la commande `cli`.

<hr />

Traduit par IA. Veuillez vérifier le contenu pour plus de précision.