GitHub Actions'tan Gerçekten Nefret Ediyorum
(xlii.space)- Geliştiricinin, GitHub Actions'ın yavaş geri bildirim döngüsü ve karmaşık hata ayıklama süreciyle yaşadığı hayal kırıklığı deneyimi paylaşılıyor
- tmplr projesinde
build.rsüzerinden CUE ile belgeler üretildi, ancak CI derlemesi başarısız olunca sorun başladı - 4 platformdan yalnızca Linux ARM derlemesi başarısız oldu; nedeni, cross build sırasında x86_64 ikili dosyalarının arm64 runner üzerinde gizlenmesine yol açan GitHub Actions çalışma biçimi
- Tek bir değişikliği test etmek için 2-3 dakika harcanan verimsiz geri bildirim döngüsü tekrarlandı
- Çözüm olarak
build.rssilinip GNU Makefile'a geçildi; CI mantığı doğrudan kontrol edilerek sorun çözüldü
Sorunun ortaya çıkış arka planı
- tmplr, insanların okuyup yazabildiği şablon dosyalarını kullanan bir dosya/proje scaffold aracı
build.rsiçinde CUE kullanılarakREADME.md,CHANGELOG.md, sürüm/yardım dosyaları üretiliyor ve böylece tutarlılık sağlanıyordu- İşin kendisi yaklaşık 1,5 saatte tamamlandı ve ilgili yazı da yazıldı
- Yerelde her şey düzgün çalışıyordu, ancak GitHub Actions'ın CI ortamında CUE ikili dosyası kurulu olmadığı için derleme başarısız oldu
Derleme hatasının nedeni
- 4 platformdan (Linux ARM, macOS ARM, Linux x86_64, macOS x86_64) yalnızca Linux ARM'de “command not found” hatası oluştu
- Neden: matrix cross build çok sıkı şekilde yalıtılmış durumda, bu yüzden CUE yalnızca x86_64 Linux host ve macOS ARM host üzerine kuruluydu
- macOS, x86_64 ikili dosyalarını çalıştırmakta sorun yaşamıyor
- Linux x86_64 de x86_64 ikili dosyalarını çalıştırmakta sorun yaşamıyor
- Ancak GitHub Actions, arm64 runner üzerinde x86_64 ikili dosyalarını gizleyerek çalıştırılamaz hale getiriyor
Verimsiz geri bildirim döngüsü
- Sorunu çözmek için tekrar tekrar izlenen süreç:
1. Olası düzeltme yöntemlerini araştır
2.ci.ymldosyasını değiştir
3. Commit edip push et (jj squash --ignore-immutable && jj git push)
4. "Actions" sekmesini aç
5. En son çalıştırmayı aç
6. Linux ARM çalıştırmasını aç
7. Birkaç saniye bekle
8. Hayal kırıklığı yaşa
9. Tekrar et - Tek bir değişiklik için 2-3 dakika harcandı
- İdeal olarak GitHub ya tam özellikli bir yerel runner sağlamalı ya da push sonrası ilerlemeyi hızlıca görmeyi mümkün kılan bir özellik sunmalı
- "scratch commit" benzeri bir özellik: Git geçmişini ve Action çalıştırma kayıtlarını kirletmeden farklı çalıştırmaları test etmenin bir yolu
- Ancak şu anda böyle bir özellik yok
Çözüm yolu
- 30 dakika boyunca döngü tekrarlandıktan sonra duruldu
- İnternette önerilen yaklaşım uygulandı: "GitHub Actions'ın mantığı yönetmesine izin vermeyin; betikleri doğrudan siz kontrol edin ve Actions yalnızca o betikleri çağırsın"
build.rssilindi (biraz üzücü olsa da bu fedakârlık gerekliydi)- Tüm üretim işleri GNU Makefile'a taşındı
- Üretilen dosyalar depoya commit edildi ve CI değişiklikleri geri alındı
- Sorun tamamen çözüldü
Sonuç
- GitHub Actions, bazı iyi şeylere sahip olamamanın nedeni oluyor
- Runner hata ayıklama ya da derleme sürecini optimize etme sırasında çok zaman kaybına yol açıyor
- Ancak başka yollarla elde etmesi zor olan macOS derlemeleri gibi avantajlar da var
- Elbette GitHub Actions'tan daha kolay yapılandırılan başka bir sistem de pek bilinmiyor
We are all doomed to GitHub Actions. …but at least I dodged the bullet early.
3 yorum
GitHub Actions sadece ortam kurulumu (OS, build toolchain, …) ve script (shell, Python, bat, ps1…) çalıştırma işi yapmalı. GitHub çökse bile, sadece ortam hazırsa her yerde build alınabilmeli. Son zamanlarda GitHub Actions workflow’larına bakınca, buna kadar da gidip özel bir şeyler kullanmak gerçekten gerekli mi diye düşündürüyor. Çok eskiden(?) Ansible da böyle yapıp battı.
Hacker News yorumları
GitHub Actions’ın temel sorunu, geri bildirim döngüsünün fazla yavaş olması
Basit bir hatayı görmek için push atıp beklemek gerçekten sinir bozucu
CI işlerini yerelde çalıştırılabilen script’lere ayırmanın ve Actions özelliklerini yalnızca kademeli iyileştirme olarak kullanmanın daha iyi olduğunu düşünüyorum
workflow_dispatchvegh workflow runbirleşimi de fena değil, ama ikincisinin çalıştırılan workflow’nun URL’sini doğrudan vermemesi kullanışsızHızlı geri bildirim almakta oldukça başarılı oldu
Bir sorun çıkarsa, GitHub Actions ortamına neredeyse birebir aynı durumda debug edebiliyorum
Bu, tüm CI sistemleri için temel bir gereklilik olmalı
Sonuçta önemli olan kuyruklama, çıktı analizi ve build geçmişi telemetrisi gibi özellikler
gh workflow runkullanırken URL almak için GitHub API ile workflow çalıştırma listesini yeniden çekmem gerektiAynı anda birden fazla çalışma varsa karışabiliyor, ama şimdilik idare ediyor
CI tasarımı için birkaç ipucu derledim
Basit bir shell yeterli olmalı
CI target’larını
Makefileiçinde tanımlayıp,make ci-testgibi basitçe çağırmak iyi olurO zamandan beri tüm CI’ı
make buildgibi basit wrapper’larla yönetiyorumBeginStep("Step Name")gibi işaretleyicilerle ayırabilmek güzel olurduSorun GitHub Actions’ın kendisinden çok, üstüne dağınık şekilde bindirilmiş otomasyon
Mantığın Python gibi bir dille script’e dökülmesi ve yerelde de çalıştırılabilmesi gerekiyor
Her seferinde workflow’yu değiştirip push atıp beklemek gerekiyor
Ben tüm CI’ı container içinde hallediyorum
CI platformu sadece o container’ı çalıştırıyor, bu yüzden yerelde de aynısını koşturabiliyorum
Platformlar bu yaklaşımı sevmez, çünkü vendor lock-in bozulur
Hata olduğunda SSH ile doğrudan bağlanıp debug edebiliyorsunuz ve branch’e push atmadan manifest’i değiştirip yeniden çalıştırabiliyorsunuz
Ama self-hosting gerekiyor
Standartlaşma kolaylaşıyor ama image bakım maliyeti gibi bir ödünleşim doğuyor
Aslında ortada bir lock-in yok, ama insanlar CI/CD cargo cult’una kapılmış durumda
Ben GitHub Actions’ı seviyorum
Eskiden kullandığım Travis’ten daha iyi ve OSS projeleri için ücretsiz kaynak olarak çok faydalı
Nix’e geçtikten sonra ortamın yeniden üretilebilirliği arttı, bu da Actions ile uyumu çok iyileştirdi
flake ile oluşturulan container’ı Actions içinde aynen çalıştırabiliyorsunuz
örnek proje
Bence GitHub Actions yalnızca bash veya Python script’lerini çağıran bir yapı olmalı
bash’ın sınırları var, Python daha esnek ve yerelde çalıştırması da kolay
bu yazıdaki gibi uv’yi otomatik kurup bağımlılıkları yöneten bir yaklaşım ideal
bash’tan daha karmaşık ama Actions ortamında performans sorunu büyük değil
Actions’ın en büyük sorunu, workflow’ları birleştirin şeklindeki tanıtım biçimi
Debug etmek neredeyse imkânsız ve cache ayarı zahmetli olduğu için build’ler yavaşlıyor
Bu yüzden kalıcı VM üzerinde doğrudan çalıştırma yaklaşımı cazip geliyor
Ben Depot’nun kurucusuyum
GitHub Actions runner’larını daha hızlı ve daha ucuza sunan bir hizmet işletiyorum
İnsanların hissettiği memnuniyetsizlik gerçekten çoğunluğun görüşü
Actions sistemi yapısal olarak verimsiz ve her hafta yeni bir darboğaz keşfediyoruz
Daha iyi bir yol olduğuna inanıyorum ve bunu deniyoruz
Ayrıntılar için depot.dev
Geçen hafta sonu
gg watch actionadlı bir araç yaptımMevcut branch’in en son ya da hâlen çalışan action’ını bulan bir araç
GitHub linki
ghCLI’ın bir özelliği olmalıydı” diye iyi tepki aldıAma
gg tuikomutunda repository’nin görünmemesi gibi bir bug vardıactgibi araçlar işe yarar mı diye merak ettimnektos/act
Mimari farklar yüzünden yerel ve çevrimiçi çalıştırma birebir aynı olmayabilir, ama yine de faydalı görünüyor
Yaklaşık %80 uyumluluk vardı
SourceHut bunu destekliyor ve gerçekten çok kullanışlı
YAML içine mantık koymak zorunda bırakan bir yapı olduğu için kaçınılmaz bir sorun gibi görünüyor.
Yukarıdaki yazı buna kabaca aşağıdaki gibi bir yanıt vermiş gibi, ama script kısmını Dagger ile değiştirirsek asıl doğru cevap bu değil mi diye de düşündürüyor.
"GitHub Actions'ın mantığı yönetmesine izin vermeyin; script'i doğrudan siz kontrol edin ve Actions sadece o script'i çağırsın"