Studii / S18
Ce protejează versiunile imuabile în fluxurile de lucru GitHub Actions
Ce protejează versiunile imuabile ale GitHub în fluxurile de lucru Actions ale depozitelor populare?
Rezumat
Din 2025-10-28, o versiune (release) GitHub poate fi publicată ca imuabilă: eticheta (tag) Git a acesteia nu mai poate fi mutată sau ștearsă. Documentația GitHub le spune, de asemenea, autorilor de acțiuni că o etichetă pe care vor să o actualizeze în continuare, cum ar fi eticheta de versiune majoră v1, nu trebuie legată de o versiune, și le sugerează „recommend that your users specify a major version” (să le recomande utilizatorilor lor să specifice o versiune majoră). Un flux de lucru care scrie uses: owner/action@v1 urmează această utilizare documentată și intenționată, iar versiunile imuabile nu îl protejează. Am măsurat ce protejează mecanismul în practică, pe 2026-10-03, exclusiv prin API-ul GitHub:
- A: primele 1.000 de depozite după numărul de stele dintre depozitele publice care nu sunt fork-uri, nu sunt arhivate și au primit un push în ultimele 90 de zile (prag: 29.565 de stele);
- B: 500 de depozite extrase aleatoriu (sămânța 20261003) dintre cele 20.553 de depozite de acest tip care au între 1.000 și 5.000 de stele.
Fluxurile de lucru de pe ramura lor implicită conțin 58.690 de referințe uses: la distanță în A și 10.472 în B. Fiecare a fost clasificată ca fixată prin SHA de commit, prin eticheta unei versiuni imuabile, printr-o etichetă mutabilă sau printr-o ramură.
Acolo unde autorul publică deja versiuni imuabile, aproape nicio referință nu este protejată. Dintre referințele prin etichetă către acțiuni a căror ultimă versiune este imuabilă, 312 din 6.898 (4,5 %) indică o etichetă protejată în A (interval de 95 %: 2,8–7,1 %, bootstrap pe depozite), iar 76 din 1.564 (4,9 %) în B. Cele protejate sunt concentrate: un singur depozit deține 68 dintre cele 312, iar excluderea oricărui depozit luat individual dă 3,6–4,6 %. Aproape toate celelalte sunt etichete de versiune majoră precum @v7. Pentru 3.238 din 6.586 (49,2 %) dintre referințele neprotejate din A (interval 43,2–56,0 %), o etichetă de versiune imuabilă indică deja același commit, deci trecerea la ea nu ar schimba codul care rulează.
Acțiunile cele mai folosite. 28 din 50 (56,0 %) dintre depozitele de acțiuni folosite de cele mai multe depozite din A își publică ultima versiune ca imuabilă. Acțiunile proprii ale GitHub: 12 din 28 (42,9 %) pentru actions/* (da: setup-node, setup-python, setup-go, setup-java; nu: checkout, cache, upload-artifact, download-artifact, github-script) și 3 din 6 (50,0 %) pentru github/*.
Fixarea prin SHA (pinning) este cea care asigură protecția, într-o minoritate de depozite. Cumulat, 32.978 din 58.690 de referințe la distanță din A (56,2 %) sunt fixate prin SHA (interval 50,7–61,7 %), iar 4.812 din 10.472 (46,0 %) în B (interval 29,0–60,1 %; 37,7 % fără cel mai mare depozit al său, open-telemetry/opentelemetry-python, care conține 1.392 de referințe). Depozitul tipic fixează puține: mediana, pe depozit, a ponderii fixate prin SHA este de 5,0 % în A și de 0,0 % în B. Toate referințele la distanță scrise în fișierele fluxurilor de lucru sunt fixate prin SHA în cel mult 263 din 891 de depozite din A (29,5 %) și în 174 din 891 (19,5 %) dacă sunt excluse cele 89 care apelează și acțiuni locale pe care nu le-am citit; în B, în cel mult 65 din 398 (16,3 %) sau în 55 din 398 (13,8 %). Etichete imuabile: 0,6 % dintre referințe în A, 0,8 % în B.
Blocarea dependențelor la nivelul fluxului de lucru (workflow-level dependency locking), anunțată pe 2026-03-26 cu „Public preview 3-6 months” (previzualizare publică în 3-6 luni), nu fusese încă lansată pe 2026-10-03: elementele sale din foaia de parcurs sunt deschise și nici vreo intrare din jurnalul de modificări (changelog), nici referința de sintaxă a fluxurilor de lucru nu o documentează. Aceste cifre descriu situația dinaintea lansării.
Lucrări anterioare. datosh/pinned-actions urmărește fixarea prin SHA în primele 10.000 de depozite după numărul de stele („only 7%” [doar 7 %] le fixează complet, aprilie 2026; 506 din 6.290 de depozite care folosesc Actions, 8,0 %, în arhiva sa) și a adăugat în aprilie 2026 o verificare a imuabilității ultimei versiuni; joshjohanning/ensure-immutable-actions (din 2025-11) verifică dacă referințele din fluxurile de lucru folosesc versiuni imuabile. Unele articole au măsurat în 2022 o fixare prin SHA de 1–2 % dintre referințe; NDSS 2026 a constatat că 16,2 % dintre depozite fac referire la toate acțiunile terțe prin SHA sau printr-o etichetă a unui creator verificat. Valoarea noastră de 29,5 % diferă de cea de 8,0 % a lui datosh în principal prin populație (primele 1.000 cu activitate recentă, nu primele 10.000) și prin dată; primele 1.000 de intrări din propria listă a lui datosh dau 100 din 781 (12,8 %). Din câte am putut găsi, H1 (câte referințe prin etichetă sunt protejate de versiunile imuabile) și cei 49,2 % cu o etichetă imuabilă pe același commit nu fuseseră măsurate. Articolul și sursele: https://easybyte.es/lab/studies/s18/paper/.
Automatizare și evaluare. Agenți de IA au realizat studiul și au redactat textul. Un evaluator IA independent a verificat lucrarea; constatările sale au fost aplicate (METHOD.md, secțiunea Deviations).
Conflicte de interese. EasyByte dezvoltă attest-lint și ar putea publica scripts/uses_check.py, clasificatorul folosit aici, ca instrument gratuit. Spre deosebire de ensure-immutable-actions, care sugerează fixări prin SHA, acesta indică, pentru fiecare etichetă mobilă, eticheta de versiune imuabilă de pe același commit.
Citați acest studiu
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@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}
}