Exercice - Utilisation de GitHub Script dans GitHub Actions

Effectué

Dans cette unité, vous allez en savoir plus sur la façon d’utiliser GitHub Script pour améliorer votre workflow.

Ajouter des problèmes à un tableau de projet

En plus d’utiliser octokit/rest.js pour créer des commentaires et ouvrir des demandes de tirage (pull request), vous pouvez utiliser octokit/rest.js pour gérer des projets GitHub. Dans l’exemple de code ci-dessous, vous créerez un workflow qui s’exécute chaque fois qu’une personne ajoute un nouveau problème au dépôt. Le problème est alors ajouté à un tableau de projet, ce qui vous permet de trier plus facilement vos tâches.

name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: "🎉 You've created this issue comment using GitHub Script!!!"
            })
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

La première section de ce workflow crée un commentaire chaque fois qu’un problème est créé, ce que nous avons abordé dans l’unité précédente. La section suivante crée une carte basée sur ce problème et l’ajoute au tableau de projet.

Séparer le workflow en étapes

L’un des avantages des actions est que vous pouvez séparer des travaux en unités de travail plus petites appelées « étapes ». Dans l’exemple de workflow précédent, vous pouvez le séparer en deux étapes.

L’un des avantages de diviser le workflow actuel en plusieurs étapes est que vous pouvez utiliser des expressions pour appliquer une logique. Les étapes vous autorisent à créer des règles précisant quand les étapes sont autorisées à s’exécuter et vous aident à optimiser l’exécution de votre workflow.

Pour séparer l’exemple de workflow en étapes :

  • Nommez les étapes pour pouvoir les suivre sous l’onglet Actions.
  • Utilisez des expressions pour déterminer si une étape doit s’exécuter (facultatif).

Dans cet exemple, les deux tâches du fichier de workflow d’origine ont été séparées en étapes individuelles.

name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - name: Comment on new issue
      uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: "🎉 You've created this issue comment using GitHub Script!!!"
            })
    - name: Add issue to project board
      if: contains(github.event.issue.labels.*.name, 'bug')
      uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

Les étapes incluent un élément descriptif name, ce qui vous permet également de les suivre sous l’onglet Actions.

L’étape Add issue to project board comprend également une instruction if qui spécifie que le problème doit être ajouté au tableau de projet uniquement s’il a l’étiquette bug.

Utiliser l’environnement Node.js

Le script GitHub vous donne également accès à un environnement Node.js complet. Bien que le script GitHub ne soit pas recommandé pour écrire la logique d’actions complexes, vous pouvez l’utiliser pour ajouter des fonctionnalités supplémentaires à l’API octo/rest.js.

Un exemple serait d’utiliser Node.js pour afficher un guide de contribution chaque fois qu’un ticket est ouvert. Vous pouvez utiliser le système de fichiers Node.js pour lire un fichier et l’utiliser comme corps du commentaire du problème. Pour accéder aux fichiers du dépôt, incluez l’action actions/checkout comme première étape du workflow.

L’exemple ci-dessous apporte les modifications suivantes au fichier de workflow :

  • Ajoute l’action action/checkout pour lire le fichier de réponse basé sur un modèle situé à l’emplacement .github/ISSUE_COMMENT/comment.md
  • Ajoute JavaScript pour utiliser le module Node.js File System afin de placer le contenu de notre réponse basée sur un modèle dans le corps du commentaire du problème
name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repo
        uses: actions/checkout@v2
      - name: Comment on new issue
        uses: actions/github-script@0.8.0
        with:
          github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
          script: |
             const fs = require('fs')
             const issueBody = fs.readFileSync(".github/ISSUE_RESPONSES/comment.md", "utf8")
             github.issues.createComment({
             issue_number: context.issue.number,
             owner: context.repo.owner,
             repo: context.repo.repo,
             body: issueBody
             })
      - name: Add issue to project board
        if: contains(github.event.issue.labels.*.name, 'bug')
        uses: actions/github-script@0.8.0
        with:
          github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
          script: |
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

Le script GitHub vous a permis de créer une réponse complète à un nouveau problème ouvert. Cette réponse est également basée sur un modèle dans le dépôt. Vous pourrez donc facilement la modifier. Enfin, vous avez également inclus un déclencheur pour ajouter le problème au tableau de projet afin de pouvoir facilement le trier pour les travaux futurs.