EasyxLab
Langue: FR Français

Traduction par IA de l'original en anglais, qui est la version de référence. Lire en anglais

Études / S18

Ce que protègent les versions immuables dans les workflows GitHub Actions

Que protègent les versions immuables de GitHub dans les workflows Actions des dépôts populaires ?

Version de travailPubliée 2026-10-03

Résumé

Depuis le 2025-10-28, une version (release) GitHub peut être publiée comme immuable : son étiquette (tag) Git ne peut plus être déplacée ni supprimée. La documentation de GitHub indique aussi aux auteurs d'actions qu'une étiquette qu'ils veulent continuer à mettre à jour, comme l'étiquette de version majeure v1, ne doit pas être liée à une version, et leur suggère de « recommend that your users specify a major version » (recommander à leurs utilisateurs d'indiquer une version majeure). Un workflow qui écrit uses: owner/action@v1 suit cet usage documenté et voulu, et les versions immuables ne le protègent pas. Nous avons mesuré ce que le mécanisme protège en pratique, le 2026-10-03, uniquement au moyen de l'API GitHub :

  • A : les 1 000 dépôts ayant le plus d'étoiles parmi les dépôts publics qui ne sont ni des forks ni archivés et qui ont reçu un push au cours des 90 derniers jours (seuil : 29 565 étoiles) ;
  • B : 500 dépôts tirés au hasard (graine 20261003) parmi les 20 553 dépôts de ce type ayant entre 1 000 et 5 000 étoiles.

Les workflows de leur branche par défaut contiennent 58 690 références uses: distantes dans A et 10 472 dans B. Chacune a été classée comme épinglée par SHA de commit, par l'étiquette d'une version immuable, par une étiquette mutable ou par une branche.

Là où l'auteur publie déjà des versions immuables, presque aucune référence n'est protégée. Parmi les références par étiquette vers des actions dont la dernière version est immuable, 312 sur 6 898 (4,5 %) pointent vers une étiquette protégée dans A (intervalle à 95 % : 2,8–7,1 %, bootstrap par dépôt), et 76 sur 1 564 (4,9 %) dans B. Les références protégées sont concentrées : un seul dépôt en détient 68 sur 312, et l'exclusion de n'importe quel dépôt pris isolément donne 3,6–4,6 %. Presque toutes les autres sont des étiquettes de version majeure comme @v7. Pour 3 238 sur 6 586 (49,2 %) des références non protégées de A (intervalle 43,2–56,0 %), une étiquette de version immuable pointe déjà vers le même commit ; y passer ne changerait donc pas le code exécuté.

Actions les plus utilisées. 28 sur 50 (56,0 %) des dépôts d'actions utilisés par le plus grand nombre de dépôts de A publient leur dernière version comme immuable. Actions propres à GitHub : 12 sur 28 (42,9 %) pour actions/* (oui : setup-node, setup-python, setup-go, setup-java ; non : checkout, cache, upload-artifact, download-artifact, github-script) et 3 sur 6 (50,0 %) pour github/*.

C'est l'épinglage par SHA qui assure la protection, dans une minorité de dépôts. Au total, 32 978 sur 58 690 (56,2 %) références distantes de A sont épinglées par SHA (intervalle 50,7–61,7 %) et 4 812 sur 10 472 (46,0 %) dans B (intervalle 29,0–60,1 % ; 37,7 % sans son plus grand dépôt, open-telemetry/opentelemetry-python, qui contient 1 392 références). Le dépôt typique en épingle peu : la médiane, par dépôt, de la part épinglée par SHA est de 5,0 % dans A et de 0,0 % dans B. Toutes les références distantes écrites dans les fichiers de workflow sont épinglées par SHA dans au plus 263 dépôts sur 891 (29,5 %) dans A, et dans 174 sur 891 (19,5 %) si l'on écarte les 89 qui appellent aussi des actions locales que nous n'avons pas lues ; dans B, au plus 65 sur 398 (16,3 %), ou 55 sur 398 (13,8 %). Étiquettes immuables : 0,6 % des références dans A, 0,8 % dans B.

Le verrouillage des dépendances au niveau du workflow (workflow-level dependency locking), annoncé le 2026-03-26 avec « Public preview 3-6 months » (préversion publique dans 3 à 6 mois), n'était pas disponible le 2026-10-03 : ses éléments de feuille de route sont toujours ouverts, et aucune entrée du changelog ni la référence de syntaxe des workflows ne le documente. Ces chiffres décrivent la situation avant sa mise à disposition.

Travaux antérieurs. datosh/pinned-actions suit l'épinglage par SHA dans les 10 000 dépôts ayant le plus d'étoiles (« only 7% » [seulement 7 %] épinglent entièrement, avril 2026 ; 506 sur 6 290 dépôts utilisant Actions, 8,0 %, dans ses archives) et a ajouté en avril 2026 une vérification de l'immuabilité de la dernière version ; joshjohanning/ensure-immutable-actions (depuis 2025-11) vérifie si les références des workflows utilisent des versions immuables. Des articles ont mesuré en 2022 un épinglage par SHA de 1–2 % des références ; NDSS 2026 a trouvé 16,2 % de dépôts qui référencent toutes les actions tierces par SHA ou par une étiquette d'un créateur vérifié. Nos 29,5 % diffèrent des 8,0 % de datosh surtout par la population (les 1 000 premiers avec une activité récente, et non les 10 000 premiers) et par la date ; les 1 000 premières entrées de datosh lui-même donnent 100 sur 781 (12,8 %). Pour autant que nous ayons pu le trouver, H1 (combien de références par étiquette les versions immuables protègent) et les 49,2 % ayant une étiquette immuable sur le même commit n'avaient pas été mesurés. Article et sources : https://easybyte.es/lab/studies/s18/paper/.

Automatisation et relecture. Des agents d'IA ont mené l'étude et rédigé le texte. Un relecteur IA indépendant a vérifié le travail ; ses constats ont été appliqués (METHOD.md, section Deviations).

Conflits d'intérêts. EasyByte développe attest-lint et pourrait publier scripts/uses_check.py, le classificateur utilisé ici, sous forme d'outil gratuit. Contrairement à ensure-immutable-actions, qui suggère des épinglages par SHA, il indique pour chaque étiquette déplaçable l'étiquette de version immuable qui pointe vers le même commit.

Citer cette étude

Citation
EasyxLab (2026). What immutable releases protect in GitHub Actions workflows. Study S18. EasyByte Hub S. Coop. Mad. https://github.com/easybytehub/easyxlab/tree/main/studies/s18-actions-immutable-releases
BibTeX
@techreport{easyxlab_s18,
  title       = {What immutable releases protect in GitHub Actions workflows},
  author      = {{EasyxLab}},
  institution = {EasyByte Hub S. Coop. Mad.},
  number      = {S18},
  year        = {2026},
  url         = {https://github.com/easybytehub/easyxlab/tree/main/studies/s18-actions-immutable-releases}
}