Badania / S18
Co chronią niezmienne wydania w workflow GitHub Actions
Co chronią niezmienne wydania serwisu GitHub w workflow Actions popularnych repozytoriów?
Streszczenie
Od 2025-10-28 wydanie (release) w serwisie GitHub można opublikować jako niezmienne (immutable): jego tagu Git nie można już przesunąć ani usunąć. Dokumentacja GitHub mówi też autorom akcji, że tag, który chcą dalej aktualizować, taki jak tag wersji głównej v1, nie może być powiązany z wydaniem, i sugeruje, by „recommend that your users specify a major version” (zalecali użytkownikom podawanie wersji głównej). Workflow zawierający uses: owner/action@v1 stosuje się do tego udokumentowanego, zamierzonego sposobu użycia, a niezmienne wydania go nie chronią. W dniu 2026-10-03 zmierzyliśmy, co ten mechanizm chroni w praktyce, korzystając wyłącznie z GitHub API:
- A: 1 000 repozytoriów z największą liczbą gwiazdek spośród publicznych, niezarchiwizowanych repozytoriów niebędących forkami, z pushem w ciągu ostatnich 90 dni (próg: 29 565 gwiazdek);
- B: 500 repozytoriów wylosowanych (ziarno 20261003) spośród 20 553 takich repozytoriów z 1 000–5 000 gwiazdek.
Workflow w ich gałęziach domyślnych zawierają 58 690 zdalnych odwołań uses: w A i 10 472 w B. Każde z nich zaklasyfikowaliśmy według tego, czym jest przypięte: SHA commita, tagiem niezmiennego wydania, zmiennym tagiem albo gałęzią.
Tam, gdzie autor już publikuje niezmienne wydania, prawie żadne odwołanie nie jest chronione. Spośród odwołań przez tag (tag references) do akcji, których najnowsze wydanie jest niezmienne, 312 z 6 898 (4,5%) wskazuje chroniony tag (protected tag) w A (przedział 95% 2,8–7,1%, bootstrap po repozytoriach), a 76 z 1 564 (4,9%) w B. Chronione odwołania są skoncentrowane: jedno repozytorium zawiera 68 z 312, a pominięcie dowolnego pojedynczego repozytorium daje 3,6–4,6%. Prawie wszystkie pozostałe to tagi wersji głównej, takie jak @v7. W przypadku 3 238 z 6 586 (49,2%) niechronionych odwołań w A (przedział 43,2–56,0%) tag niezmiennego wydania wskazuje już ten sam commit, więc przejście na niego nie zmieniłoby uruchamianego kodu.
Najczęściej używane akcje. 28 z 50 (56,0%) repozytoriów akcji używanych przez największą liczbę repozytoriów w A publikuje swoje najnowsze wydanie jako niezmienne. Akcje własne GitHub (first party): 12 z 28 (42,9%) dla actions/* (tak: setup-node, setup-python, setup-go, setup-java; nie: checkout, cache, upload-artifact, download-artifact, github-script) oraz 3 z 6 (50,0%) dla github/*.
Ochronę zapewnia przypinanie przez SHA – w mniejszości repozytoriów. Łącznie 32 978 z 58 690 (56,2%) zdalnych odwołań w A jest przypiętych przez SHA (przedział 50,7–61,7%), a w B – 4 812 z 10 472 (46,0%) (przedział 29,0–60,1%; 37,7% bez największego repozytorium, open-telemetry/opentelemetry-python, które zawiera 1 392 odwołania). Typowe repozytorium przypina niewiele: mediana udziału odwołań przez SHA w repozytorium wynosi 5,0% w A i 0,0% w B. Wszystkie zdalne odwołania zapisane w plikach workflow są przypięte przez SHA w co najwyżej 263 z 891 (29,5%) repozytoriów w A oraz w 174 z 891 (19,5%), jeśli pominąć 89 repozytoriów, które wywołują też akcje lokalne, których nie odczytaliśmy; w B – w co najwyżej 65 z 398 (16,3%) lub w 55 z 398 (13,8%). Niezmienne tagi: 0,6% odwołań w A, 0,8% w B.
Blokowanie zależności na poziomie workflow (workflow-level dependency locking), ogłoszone 2026-03-26 z adnotacją „Public preview 3-6 months”, w dniu 2026-10-03 nie było jeszcze dostępne: jego pozycje w roadmapie są otwarte i nie opisuje go żaden wpis w changelogu ani dokumentacja składni workflow. Te liczby opisują stan sprzed jego udostępnienia.
Wcześniejsze prace. datosh/pinned-actions śledzi przypinanie przez SHA w 10 000 repozytoriów z największą liczbą gwiazdek („only 7%” przypina w pełni, kwiecień 2026 r.; w jego archiwum 506 z 6 290 repozytoriów używających Actions, 8,0%), a w kwietniu 2026 r. dodał sprawdzanie, czy najnowsze wydanie jest niezmienne; joshjohanning/ensure-immutable-actions (od 2025-11) sprawdza, czy odwołania w workflow używają niezmiennych wydań. Artykuły z 2022 r. zmierzyły przypinanie przez SHA na poziomie 1–2% odwołań; praca z NDSS 2026 wykazała, że 16,2% repozytoriów odwołuje się do każdej akcji zewnętrznej przez SHA lub przez tag zweryfikowanego twórcy. Nasze 29,5% różni się od 8,0% w datosh głównie populacją (1 000 najpopularniejszych repozytoriów z niedawną aktywnością, a nie 10 000 najpopularniejszych) i datą; pierwsze 1 000 pozycji samego datosh daje 100 z 781 (12,8%). Na ile udało nam się ustalić, ani H1 (ile odwołań przez tag chronią niezmienne wydania), ani 49,2% z niezmiennym tagiem przy tym samym commicie nie były dotąd mierzone. Artykuł i źródła: https://easybyte.es/lab/studies/s18/paper/.
Automatyzacja i przegląd. Agenci AI przeprowadzili badanie i napisali tekst. Pracę sprawdził niezależny recenzent AI; jego uwagi zostały uwzględnione (METHOD.md, sekcja Deviations).
Konflikt interesów. EasyByte rozwija attest-lint i może udostępnić scripts/uses_check.py, użyty tu klasyfikator, jako bezpłatne narzędzie. W odróżnieniu od ensure-immutable-actions, które sugeruje przypinanie przez SHA, dla każdego przesuwalnego tagu wskazuje on tag niezmiennego wydania przy tym samym commicie.
Jak cytować to badanie
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}
}