EasyxLab
Kalba: LT Lietuvių

DI atliktas originalo anglų kalba vertimas; pamatinė versija yra originalas anglų kalba. Skaityti anglų kalba

Tyrimai / S18

Ką apsaugo nekintami leidimai GitHub Actions darbo eigose

Ką GitHub nekintami leidimai apsaugo populiarių saugyklų GitHub Actions darbo eigose (workflows)?

Darbinis juodraštisPaskelbta 2026-10-03

Santrauka

Nuo 2025-10-28 GitHub leidimą (release) galima paskelbti kaip nekintamą (immutable): jo Git žymos (tag) nebegalima perkelti ar ištrinti. GitHub dokumentacijoje veiksmų (actions) autoriams taip pat nurodoma, kad žyma, kurią jie nori toliau atnaujinti, pavyzdžiui, pagrindinės versijos žyma v1, neturi būti susieta su leidimu, ir siūloma jiems „rekomenduoti naudotojams nurodyti pagrindinę versiją“. Darbo eiga (workflow), kurioje parašyta uses: owner/action@v1, laikosi šio dokumentuoto, numatyto naudojimo būdo, ir nekintami leidimai jos neapsaugo. 2026-10-03 išmatavome, ką šis mechanizmas apsaugo praktiškai, naudodami tik GitHub API:

  • A: 1000 daugiausia žvaigždučių turinčių saugyklų iš viešų saugyklų, kurios nėra atšakos (forks), nėra archyvuotos ir į kurias per pastarąsias 90 dienų buvo atliktas push (riba – 29 565 žvaigždutės);
  • B: 500 saugyklų, atsitiktinai atrinktų (sėkla 20261003) iš 20 553 tokių saugyklų, turinčių 1000–5000 žvaigždučių.

Jų numatytosios šakos darbo eigose yra 58 690 nuotolinių uses: nuorodų grupėje A ir 10 472 grupėje B. Kiekviena jų suklasifikuota kaip fiksuota (pinned) pagal commit SHA, pagal nekintamo leidimo žymą, pagal keičiamą žymą arba pagal šaką.

Kai autorius jau skelbia nekintamus leidimus, beveik nė viena nuoroda nėra apsaugota. Iš nuorodų į žymas veiksmų, kurių naujausias leidimas yra nekintamas, grupėje A 312 iš 6898 (4,5 %) nurodo apsaugotą žymą (95 % intervalas 2,8–7,1 %, bootstrap pagal saugyklas), o grupėje B – 76 iš 1564 (4,9 %). Apsaugotosios sukoncentruotos: vienoje saugykloje yra 68 iš tų 312, o neįtraukus bet kurios vienos saugyklos gaunama 3,6–4,6 %. Beveik visos kitos yra pagrindinės versijos žymos, pavyzdžiui, @v7. 3238 iš 6586 (49,2 %) neapsaugotų grupės A nuorodų (intervalas 43,2–56,0 %) atveju nekintamo leidimo žyma jau nurodo tą patį commit, todėl perėjus prie jos vykdomas kodas nepasikeistų.

Dažniausiai naudojami veiksmai. 28 iš 50 (56,0 %) veiksmų saugyklų, kurias grupėje A naudoja daugiausia saugyklų, savo naujausią leidimą skelbia kaip nekintamą. Pačios GitHub veiksmai (first party): actions/* – 12 iš 28 (42,9 %) (taip: setup-node, setup-python, setup-go, setup-java; ne: checkout, cache, upload-artifact, download-artifact, github-script), github/* – 3 iš 6 (50,0 %).

Apsaugą užtikrina fiksavimas pagal SHA, ir tik mažumoje saugyklų. Bendrai grupėje A pagal SHA fiksuota 32 978 iš 58 690 (56,2 %) nuotolinių nuorodų (intervalas 50,7–61,7 %), o grupėje B – 4812 iš 10 472 (46,0 %) (intervalas 29,0–60,1 %; 37,7 % be didžiausios jos saugyklos open-telemetry/opentelemetry-python, kurioje yra 1392 nuorodos). Tipinė saugykla fiksuoja nedaug: SHA dalies pagal saugyklą mediana yra 5,0 % grupėje A ir 0,0 % grupėje B. Saugyklų, kurių darbo eigų failuose įrašytos visos nuotolinės nuorodos fiksuotos pagal SHA, grupėje A yra ne daugiau kaip 263 iš 891 (29,5 %), o 174 iš 891 (19,5 %), jei neįskaičiuojamos 89 saugyklos, kurios taip pat kviečia vietinius veiksmus, kurių neperskaitėme; grupėje B – ne daugiau kaip 65 iš 398 (16,3 %), arba 55 iš 398 (13,8 %). Nekintamos žymos: 0,6 % nuorodų grupėje A, 0,8 % grupėje B.

Priklausomybių užrakinimas darbo eigos lygmeniu (workflow-level dependency locking), paskelbtas 2026-03-26 su užrašu „Public preview 3-6 months“, 2026-10-03 dar nebuvo išleistas: jo veiksmų plano (roadmap) punktai tebėra atviri, ir jo neaprašo nė vienas pakeitimų žurnalo (changelog) įrašas ar darbo eigų sintaksės žinynas. Šie skaičiai apibūdina būklę prieš jo išleidimą.

Ankstesni darbai. datosh/pinned-actions stebi fiksavimą pagal SHA 10 000 daugiausia žvaigždučių turinčių saugyklų („tik 7 %“ fiksuoja visiškai, 2026 m. balandis; jo archyve – 506 iš 6290 Actions naudojančių saugyklų, 8,0 %) ir 2026 m. balandį pridėjo naujausio leidimo nekintamumo patikrą; joshjohanning/ensure-immutable-actions (nuo 2025-11) tikrina, ar darbo eigų nuorodos naudoja nekintamus leidimus. 2022 m. straipsniuose fiksavimas pagal SHA išmatuotas 1–2 % nuorodų; NDSS 2026 nustatė, kad 16,2 % saugyklų kiekvieną trečiosios šalies veiksmą nurodo pagal SHA arba patvirtinto kūrėjo (verified creator) žymą. Mūsų 29,5 % nuo datosh 8,0 % skiriasi daugiausia dėl populiacijos (1000 populiariausių su neseniai vykdyta veikla, o ne 10 000 populiariausių) ir datos; paties datosh pirmieji 1000 įrašų duoda 100 iš 781 (12,8 %). Kiek pavyko rasti, H1 (kiek nuorodų į žymas apsaugo nekintami leidimai) ir 49,2 % su nekintama žyma tame pačiame commit nebuvo išmatuoti. Straipsnis ir šaltiniai: https://easybyte.es/lab/studies/s18/paper/.

Automatizavimas ir peržiūra. Tyrimą atliko ir tekstą parašė DI agentai. Darbą patikrino nepriklausomas DI recenzentas; jo pastabos pritaikytos (METHOD.md, skyrius Deviations).

Interesų konfliktas. EasyByte kuria attest-lint ir gali išleisti čia naudotą klasifikatorių scripts/uses_check.py kaip nemokamą įrankį. Kitaip nei ensure-immutable-actions, kuris siūlo fiksuoti pagal SHA, jis kiekvienai perkeliamai žymai nurodo nekintamo leidimo žymą, esančią tame pačiame commit.

Cituokite šį tyrimą

Bibliografinė nuoroda
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}
}