Μελέτες / S18
Τι προστατεύουν οι αμετάβλητες εκδόσεις στις ροές εργασιών του GitHub Actions
Τι προστατεύουν οι αμετάβλητες εκδόσεις (immutable releases) του GitHub στις ροές εργασιών Actions δημοφιλών αποθετηρίων;
Περίληψη
Από τις 2025-10-28 μια έκδοση (release) του GitHub μπορεί να δημοσιευθεί ως αμετάβλητη (immutable): η ετικέτα Git της δεν μπορεί πλέον να μετακινηθεί ή να διαγραφεί. Η τεκμηρίωση του GitHub λέει επίσης στους δημιουργούς actions ότι μια ετικέτα που θέλουν να συνεχίσουν να ενημερώνουν, όπως η ετικέτα κύριας έκδοσης v1, δεν πρέπει να συνδέεται με έκδοση, και τους προτείνει να «recommend that your users specify a major version» (συνιστούν στους χρήστες τους να ορίζουν μια κύρια έκδοση). Μια ροή εργασιών που γράφει uses: owner/action@v1 ακολουθεί αυτή την τεκμηριωμένη, προβλεπόμενη χρήση, και οι αμετάβλητες εκδόσεις δεν την προστατεύουν. Μετρήσαμε τι προστατεύει ο μηχανισμός στην πράξη, στις 2026-10-03, αποκλειστικά μέσω του API του GitHub:
- A: τα 1.000 αποθετήρια με τα περισσότερα αστέρια μεταξύ των δημόσιων αποθετηρίων που δεν είναι forks, δεν είναι αρχειοθετημένα και δέχτηκαν push τις τελευταίες 90 ημέρες (όριο 29.565 αστέρια)·
- B: 500 αποθετήρια επιλεγμένα τυχαία (σπόρος 20261003) από τα 20.553 τέτοια αποθετήρια με 1.000–5.000 αστέρια.
Οι ροές εργασιών τους στον προεπιλεγμένο κλάδο περιέχουν 58.690 απομακρυσμένες αναφορές uses: στο A και 10.472 στο B. Κάθε αναφορά ταξινομήθηκε ανάλογα με το αν είναι καρφιτσωμένη (pinned) στο SHA ενός commit, στην ετικέτα μιας αμετάβλητης έκδοσης, σε μεταβλητή ετικέτα ή σε κλάδο.
Όπου ο δημιουργός ήδη δημοσιεύει αμετάβλητες εκδόσεις, σχεδόν καμία αναφορά δεν προστατεύεται. Από τις αναφορές μέσω ετικέτας σε actions των οποίων η τελευταία έκδοση είναι αμετάβλητη, 312 από τις 6.898 (4,5%· 95% ΔΕ 2,8–7,1%, bootstrap ανά αποθετήριο) δείχνουν σε προστατευμένη ετικέτα (protected tag) στο A, και 76 από τις 1.564 (4,9%) στο B. Οι προστατευμένες είναι συγκεντρωμένες: ένα αποθετήριο περιέχει 68 από τις 312, και αν εξαιρεθεί οποιοδήποτε μεμονωμένο αποθετήριο, το ποσοστό είναι 3,6–4,6%. Σχεδόν όλες οι υπόλοιπες είναι ετικέτες κύριας έκδοσης όπως @v7. Για 3.238 από τις 6.586 (49,2%) μη προστατευμένες αναφορές στο A (ΔΕ 43,2–56,0%), μια ετικέτα αμετάβλητης έκδοσης δείχνει ήδη στο ίδιο commit, οπότε η μετάβαση σε αυτήν δεν θα άλλαζε τον κώδικα που εκτελείται.
Τα πιο χρησιμοποιούμενα actions. 28 από τα 50 αποθετήρια actions (56,0%) που χρησιμοποιούνται από τα περισσότερα αποθετήρια στο A δημοσιεύουν την τελευταία τους έκδοση ως αμετάβλητη. Του ίδιου του GitHub: 12 από τα 28 (42,9%) για τα actions/* (ναι: setup-node, setup-python, setup-go, setup-java· όχι: checkout, cache, upload-artifact, download-artifact, github-script) και 3 από τα 6 (50,0%) για τα github/*.
Την προστασία την παρέχει το καρφίτσωμα σε SHA (SHA pinning), σε μια μειοψηφία αποθετηρίων. Συνολικά, 32.978 από τις 58.690 (56,2%) απομακρυσμένες αναφορές στο A είναι καρφιτσωμένες σε SHA (ΔΕ 50,7–61,7%) και 4.812 από τις 10.472 (46,0%) στο B (ΔΕ 29,0–60,1%· 37,7% χωρίς το μεγαλύτερο αποθετήριό του, open-telemetry/opentelemetry-python, που περιέχει 1.392 αναφορές). Το τυπικό αποθετήριο καρφιτσώνει λίγες: η διάμεσος του ποσοστού SHA ανά αποθετήριο είναι 5,0% στο A και 0,0% στο B. Όλες οι απομακρυσμένες αναφορές που είναι γραμμένες στα αρχεία των ροών εργασιών είναι καρφιτσωμένες σε SHA σε το πολύ 263 από τα 891 (29,5%) αποθετήρια στο A, και σε 174 από τα 891 (19,5%) αν δεν συνυπολογιστούν τα 89 που καλούν επίσης τοπικά actions τα οποία δεν διαβάσαμε· στο B, σε το πολύ 65 από τα 398 (16,3%), ή σε 55 από τα 398 (13,8%). Αμετάβλητες ετικέτες: 0,6% των αναφορών στο A, 0,8% στο B.
Το κλείδωμα εξαρτήσεων σε επίπεδο ροής εργασιών (workflow-level dependency locking), που ανακοινώθηκε στις 2026-03-26 με την ένδειξη «Public preview 3-6 months» (δημόσια προεπισκόπηση σε 3–6 μήνες), δεν είχε κυκλοφορήσει στις 2026-10-03: τα σχετικά στοιχεία του οδικού χάρτη είναι ανοιχτά, και ούτε κάποια καταχώριση στο changelog ούτε η αναφορά σύνταξης των ροών εργασιών το τεκμηριώνει. Τα στοιχεία αυτά περιγράφουν την κατάσταση πριν από την κυκλοφορία του.
Προηγούμενες εργασίες. Το datosh/pinned-actions παρακολουθεί το καρφίτσωμα σε SHA στα 10.000 αποθετήρια με τα περισσότερα αστέρια («only 7%», δηλαδή μόνο 7%, καρφιτσώνουν πλήρως, Απρίλιος 2026· 506 από τα 6.290 αποθετήρια που χρησιμοποιούν Actions, 8,0%, στο αρχείο του) και πρόσθεσε τον Απρίλιο του 2026 έλεγχο για το αν η τελευταία έκδοση είναι αμετάβλητη· το joshjohanning/ensure-immutable-actions (από το 2025-11) ελέγχει αν οι αναφορές στις ροές εργασιών χρησιμοποιούν αμετάβλητες εκδόσεις. Επιστημονικές εργασίες μέτρησαν το 2022 καρφίτσωμα σε SHA στο 1–2% των αναφορών· εργασία στο NDSS 2026 βρήκε ότι το 16,2% των αποθετηρίων αναφέρεται σε κάθε action τρίτων μέσω SHA ή μέσω ετικέτας επαληθευμένου δημιουργού. Το δικό μας 29,5% διαφέρει από το 8,0% του datosh κυρίως λόγω πληθυσμού (κορυφαία 1.000 με πρόσφατη δραστηριότητα, όχι κορυφαία 10.000) και ημερομηνίας· οι πρώτες 1.000 καταχωρίσεις του ίδιου του datosh δίνουν 100 από τα 781 (12,8%). Απ' όσο μπορέσαμε να βρούμε, η H1 (πόσες αναφορές μέσω ετικέτας προστατεύουν οι αμετάβλητες εκδόσεις) και το 49,2% με αμετάβλητη ετικέτα στο ίδιο commit δεν είχαν μετρηθεί. Εργασία και πηγές: https://easybyte.es/lab/studies/s18/paper/.
Αυτοματοποίηση και αξιολόγηση. Πράκτορες τεχνητής νοημοσύνης εκτέλεσαν τη μελέτη και έγραψαν το κείμενο. Ένας ανεξάρτητος αξιολογητής τεχνητής νοημοσύνης έλεγξε την εργασία· τα ευρήματά του εφαρμόστηκαν (METHOD.md, ενότητα Deviations).
Σύγκρουση συμφερόντων. Η EasyByte αναπτύσσει το attest-lint και ενδέχεται να διαθέσει το scripts/uses_check.py, τον ταξινομητή που χρησιμοποιήθηκε εδώ, ως δωρεάν εργαλείο. Σε αντίθεση με το ensure-immutable-actions, που προτείνει καρφίτσωμα σε SHA, αναφέρει για κάθε μετακινούμενη ετικέτα την ετικέτα αμετάβλητης έκδοσης στο ίδιο commit.
Παραπομπή σε αυτή τη μελέτη
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}
}