Ce document évolutif est un recueil de bonnes pratiques pour utiliser GitHub Actions. Si tu as des suggestions ou des ajouts, n'hésite pas à ouvrir une pull request sur GitHub !
Par défaut, GitHub Actions interrompt les workflows au bout de 6 heures s'ils ne sont pas terminés avant. Beaucoup de workflows ont besoin de bien moins de temps que ça pour se terminer, mais il arrive qu'une erreur inattendue survienne ou qu'un job reste bloqué jusqu'à ce que l'exécution du workflow soit interrompue, 6 heures après son lancement. Il est donc recommandé de définir un délai d'expiration plus court.
Le délai d'expiration idéal dépend de chaque workflow, mais 30 minutes suffisent généralement largement pour les workflows utilisés dans les dépôts Exercism.
Cela présente les avantages suivants :
jobs:
configlet:
timeout-minutes: 30
runs-on: ubuntu-latest
steps:
- [...]
Les actions doivent être considérées comme des dépendances dans ton langage de programmation préféré1 : ce sont du code écrit par des tiers, hors du contrôle d'Exercism. Même si tu fais confiance aux auteurs de l'action, le dépôt peut faire l'objet d'une prise de contrôle hostile, ce qui donnerait indirectement à ces personnes l'accès aux dépôts Exercism, y compris en écriture.
Par conséquent, demande-toi sérieusement si l'ajout d'une nouvelle action vaut vraiment le coup, ou s'il vaut mieux déplacer le code dans une action (nouvelle) sous le contrôle d'Exercism.
Vérifie aussi si l'action est activement maintenue, par exemple en regardant l'activité récente du dépôt ou en t'assurant qu'elle appartient à une organisation plutôt qu'à un compte individuel.
Les actions publiées par GitHub ou par l'organisation Exercism peuvent généralement être considérées comme sûres (ou presque) et être incluses sans examen particulier.
Par défaut, le jeton d'accès fourni au workflow dispose de permissions très larges, en lecture comme en écriture.
Le principe du moindre privilège doit aussi s'appliquer aux workflows.
Tu peux indiquer les permissions dont un workflow a besoin au niveau de chaque workflow.
Si un workflow a seulement besoin de lire le contenu d'un dépôt sans y écrire, par exemple parce qu'il s'agit d'une simple vérification de CI, tu peux restreindre le jeton comme ceci :
permissions:
contents: read
Consulte la documentation GitHub pour la liste complète des permissions.
Quand tu utilises d'autres actions, épingle-les sur un commit (via son SHA), et non sur une branche ou un tag. Ainsi, c'est toujours le même code qui sera exécuté, ce qui n'est pas garanti lorsqu'on épingle sur une branche ou un tag.
Cela présente deux avantages :
La seule exception à cette règle concerne les actions que nous (Exercism) avons écrites nous-mêmes.
En général, tu veux épingler sur le SHA de commit d'une release précise.
Pour trouver le SHA de commit d'une release, va sur la page des releases du dépôt de l'action (par exemple https://github.com/actions/checkout/releases).
Trouve la release que tu veux utiliser et clique sur le SHA abrégé (par exemple a12a394) indiqué dans la section de résumé à gauche de la release.
Tu arriveras alors sur la page de détails de la release, qui indique le SHA de commit complet à utiliser.
- name: Checkout code
uses: actions/checkout@a12a3943b4bdde767164f792f33f40b04645d846
La plupart des workflows s'exécutent sur les exécuteurs pris en charge par GitHub. Quand tu utilises l'un de ces exécuteurs, choisis une version précise plutôt que la dernière version.
Ainsi, le workflow s'exécute toujours sur le même exécuteur, ce qui rend ton build stable.
Utilise :
runs-on: ubuntu-22.04
au lieu de :
runs-on: ubuntu-latest
Il n'est souvent ni nécessaire ni utile de lancer la CI sur les commits intermédiaires si un commit plus récent a été poussé entre-temps.
Tu peux configurer une stratégie de concurrence pour annuler automatiquement les workflows en cours d'exécution dans le même contexte.
Pour annuler les builds intermédiaires dans une PR, tu peux utiliser les paramètres de concurrence suivants :
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }}
L'exemple ci-dessus est tiré du workflow CI de PkgTemplates.jl, publié sous licence MIT :
MIT License
Copyright (c) 2017-2020 Chris de Graaf, Invenia Technical Computing Corporation
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Les pratiques mentionnées ci-dessus sont loin d'être exhaustives. Pour un guide complet sur les bonnes pratiques de sécurité et l'utilisation sûre de GitHub Actions, consulte le guide de sécurité de GitHub.
Tu peux utiliser la liste de vérification suivante pour savoir si un workflow suit les bonnes pratiques. Cette liste n'a pas vocation à être exhaustive : elle se concentre sur les points les plus importants.
sauf si le langage utilise l'écosystème npm. ↩