Esercizio - Uso di GitHub Script in GitHub Actions

Completato

In questa unità si apprenderanno altre informazioni su come è possibile usare GitHub Script per migliorare il flusso di lavoro.

Aggiungere i problemi alla bacheca di un progetto

Oltre a usare octokit/rest.js per creare commenti e aprire richieste pull, è possibile usare octokit/rest.js per gestire i progetti GitHub. Nell'esempio di codice seguente si crea un flusso di lavoro che viene eseguito ogni volta che qualcuno aggiunge un nuovo problema al repository. In questo modo il problema viene aggiunto alla bacheca di un progetto, facilitando la valutazione del lavoro.

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 prima sezione di questo flusso di lavoro crea un commento ogni volta che viene creato un nuovo problema, come illustrato nell'unità precedente. La sezione successiva crea una scheda basata su questo problema e la aggiunge alla bacheca del progetto.

Separare il flusso di lavoro in passaggi

Un vantaggio dell'uso delle azioni è che è possibile separare i processi in unità di lavoro più piccole chiamate passaggi. Il precedente flusso di lavoro di esempio può essere separato in due passaggi.

Un vantaggio della suddivisione del flusso di lavoro corrente in più passaggi è che è possibile usare le espressioni per applicare la logica. L'uso dei passaggi permette di creare regole che stabiliscono quando è possibile eseguire i passaggi e può aiutare a ottimizzare l'esecuzione del flusso di lavoro.

Per separare il flusso di lavoro di esempio in passaggi:

  • Assegnare un nome a ogni passaggio per poterne tenere traccia dalla scheda Actions.
  • Usare le espressioni per determinare se un passaggio deve essere eseguito (facoltativo).

In questo esempio le due attività nel file del flusso di lavoro originale sono state separate in singoli passaggi.

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"
            });

Ogni passaggio include un elemento descrittivo name che consente anche di tenerne traccia dalla scheda Actions.

Il passaggio Add issue to project board include anche un'istruzione if che specifica che il problema deve essere aggiunto alla bacheca di progetto solo se è etichettato come bug.

Usare l'ambiente Node.js

GitHub Script concede anche l'accesso a un ambiente di Node.js completo. Anche se GitHub Script non è consigliato per scrivere la logica di azioni complesse, è possibile usarlo per aggiungere altre funzionalità all'API octo/rest.js.

Un esempio consiste nell'usare Node.js per visualizzare una guida ai contributi ogni volta che viene aperto un problema. È possibile usare il file system Node.js per leggere un file e usarlo come corpo del commento al problema. Per accedere ai file all'interno del repository, includere l'azione actions/checkout come primo passaggio del flusso di lavoro.

L'esempio qui sotto apporta le modifiche seguenti al file del flusso di lavoro:

  • Aggiunge l'azione action/checkout per leggere il file di risposta basato su modelli presente in .github/ISSUE_COMMENT/comment.md
  • Aggiunge JavaScript per usare il modulo del file system Node.js per inserire il contenuto della risposta basata su modelli come corpo del commento al problema
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"
            });

GitHub Script ha aiutato a creare una risposta completa a un nuovo problema che viene aperto. Questa risposta si basa anche su un modello nel repository, in modo da essere facilmente modificabile in futuro. Infine si è anche incluso un trigger per aggiungere il problema alla bacheca del progetto in modo che possa essere facilmente valutato per il lavoro futuro.