Déclencher manuellement GitHub Actions

Bonjour, cet article explique comment déclencher manuellement des builds GitHub Actions.

Pourquoi vouloir faire ça ?

Au lieu d'attendre simplement un changement de code ou de workflow GitHub ?

Eh bien, par exemple, la dernière fois que votre build sur master s'est exécuté, certains des serveurs utilisés par votre build étaient peut-être indisponibles (par exemple : le registre npm, une API que vous utilisez pour les tests, etc.).

Pour l'instant, GitHub indique qu'il n'y a aucun moyen de déclencher manuellement un build, alors que la question a été posée sur StackOverflow et que certaines personnes utilisent même CURL pour déclencher des builds manuellement.

Mais j'ai trouvé une meilleure solution ! Avec ma solution, une fois en place, le bouton ⭐️ de votre dépôt GitHub déclenchera un build chaque fois que VOUS (et seulement vous) mettrez une étoile au dépôt. Vous pouvez le faire autant de fois que vous voulez.

Oui, c'est une solution TRÈS bricolée, mais elle fonctionne plutôt bien. ✨

Comment déclencher manuellement

Entrons dans le vif du sujet.

GIF montrant l'utilisation du bouton étoile pour déclencher manuellement un workflow

Le bouton ⭐️ sert à lancer le workflow quand c'est possible, comme ceci.

Modifiez votre fichier de workflow pour y inclure :

on:
  watch:
    types: [started]

Ainsi, le workflow sera exécuté chaque fois que vous mettrez une étoile au dépôt, ou que vous l'enlèverez puis la remettrez.

Si on combine ça avec un conseil utile de Samira sur Stack Overflow, on peut lancer le workflow uniquement si c'est le ou la propriétaire qui déclenche l'action.

if: github.actor == github.event.repository.owner.login

Ça évite que l'action soit exécutée par d'autres personnes, et la réserve aux mainteneurs par exemple.

Ensuite, vous pouvez ajouter votre ou vos jobs et des services supplémentaires.

Au final, on obtient le workflow suivant...

name: Test

on:
  watch:
    types: [started]

jobs:
  build:
    runs-on: ubuntu-latest

    if: github.actor == github.event.repository.owner.login

    steps:
       - name: Checkout repository
         uses: actions/checkout@v2
        #  add more ...

C'est une base, vous pouvez donc l'adapter à un workflow existant ou en créer un nouveau à partir de celle-ci.

Quelques remarques

Il est possible de combiner deux événements.

Par exemple, vous pouvez configurer votre workflow avec l'événement watch et à chaque push, pour avoir les deux possibilités.

name: Test

on:
  push:
    branches:
      - master
  watch:
    types: [started]

Ici, le processus s'exécute à chaque push sur la branche master et à chaque étoile sur le dépôt.

N'oubliez pas que si vous voulez relancer un workflow qui a échoué, vous pouvez relancer toutes les vérifications grâce à un bouton de l'interface prévu pour les workflows en échec, comme ceci...

Capture d'écran de l'onglet Actions sur GitHub

Tout dépend de ce que vous voulez vraiment faire.

De plus, vous pouvez lancer tout le workflow avec l'événement watch, ou seulement certaines étapes en ajoutant une condition if sur une étape, comme ceci :

name: Test

on:
  watch:
    types: [started]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
       - name: Checkout repository
         uses: actions/checkout@v2
       - name: Step 2
         if: github.actor == github.event.repository.owner.login

Dans ce cas, l'étape 2 ne s'exécutera que si le dépôt reçoit une étoile de son propriétaire.

N'oubliez pas que le bouton ⭐️ lance le workflow uniquement depuis la branche par défaut (master).

Notez qu'il existe des permissions dans les paramètres du dépôt pour désactiver les actions ou empêcher l'exécution d'actions tierces.

Capture d'écran des permissions des actions avec 3 options : « Enable local and third party Actions for this repository », « Enable local Actions only for this repository » et « Disable Action for this repository »

Capture d'écran des permissions des actions dans les paramètres

Mise à jour : comme l'a suggéré Emilien Escalle dans les commentaires sur dev.to, on peut aussi configurer le workflow uniquement pour les collaborateurs et collaboratrices, en créant un autre job dont dépendra le build : il vérifie si la personne collabore au projet, sinon le workflow échoue.

jobs:
  authorize:
    runs-on: ubuntu-latest

    steps:
    - uses: octokit/request-action@v2.0.0
      with:
        route: GET /repos/:repository/collaborators/${{ github.actor }}
        repository: ${{ github.repository }}
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  build:
    needs: [authorize]

    runs-on: ubuntu-latest

   steps:
     - ...

Bon à savoir...

GitHub vient tout juste de publier ses API Actions, ce qui devrait bientôt permettre à GitHub ou à des extensions de navigateur d'ajouter des boutons « déclencher le workflow » dans leur interface.

J'espère que cet article vous a plu, et un merci tout particulier à Vincent qui m'a poussée à l'écrire :)