Saya Sangat Membenci GitHub Actions
(xlii.space)- Pengembang membagikan pengalaman frustrasi terhadap loop umpan balik yang lambat dan proses debugging yang rumit di GitHub Actions
- Dalam proyek tmplr, dokumentasi dibuat dengan CUE melalui
build.rs, tetapi masalah dimulai ketika build CI gagal - Dari 4 platform, hanya Linux ARM yang gagal build; penyebabnya adalah cara kerja GitHub Actions yang menyembunyikan biner x86_64 di runner arm64 saat cross build
- Loop umpan balik yang tidak efisien berulang, dengan waktu 2–3 menit untuk menguji satu perubahan
- Sebagai solusi,
build.rsdihapus dan dialihkan ke GNU Makefile, sehingga logika CI dapat dikendalikan langsung untuk menyelesaikan masalah
Latar belakang terjadinya masalah
- tmplr adalah alat scaffolding file/proyek yang menggunakan file template yang bisa dibaca dan ditulis manusia
- Di
build.rs, CUE digunakan untuk menghasilkanREADME.md,CHANGELOG.md, serta file versi/bantuan guna menjaga konsistensi - Pekerjaan itu sendiri selesai hanya dalam sekitar 1,5 jam, dan tulisan terkait juga sudah selesai dibuat
- Semuanya berjalan normal secara lokal, tetapi build gagal di lingkungan CI GitHub Actions karena biner CUE tidak terpasang
Penyebab kegagalan build
- Dari 4 platform (Linux ARM, macOS ARM, Linux x86_64, macOS x86_64), hanya Linux ARM yang mengalami error “command not found”
- Penyebabnya: matrix cross build sangat terisolasi, sehingga CUE hanya terpasang di host Linux x86_64 dan host macOS ARM
- macOS tidak bermasalah saat menjalankan biner x86_64
- Linux x86_64 juga tidak bermasalah saat menjalankan biner x86_64
- Namun, GitHub Actions menyembunyikan biner x86_64 di runner arm64, sehingga tidak bisa dijalankan
Loop umpan balik yang tidak efisien
- Proses yang berulang untuk menyelesaikan masalah:
1. Mencari kemungkinan cara perbaikan
2. Mengubahci.yml
3. Commit dan push (jj squash --ignore-immutable && jj git push)
4. Membuka tab “Actions”
5. Membuka eksekusi terbaru
6. Membuka eksekusi Linux ARM
7. Menunggu beberapa detik
8. Frustrasi
9. Ulangi - Dibutuhkan 2–3 menit untuk setiap satu perubahan
- Idealnya, GitHub menyediakan runner lokal yang lengkap fiturnya, atau setidaknya fitur untuk memeriksa progres dengan cepat setelah push
- Fitur seperti “scratch commit”: cara untuk menguji berbagai eksekusi tanpa mengotori riwayat Git dan catatan eksekusi Actions
- Namun, saat ini fitur seperti itu belum ada
Solusi
- Setelah mengulang loop selama 30 menit, proses itu dihentikan
- Menerapkan pendekatan yang dikenal di internet: “Jangan biarkan GitHub Actions mengelola logika; kendalikan sendiri lewat skrip, dan biarkan Actions hanya memanggil skrip tersebut”
build.rsdihapus (meski sayang, tetapi perlu pengorbanan)- Semua pekerjaan generasi dipindahkan ke GNU Makefile
- File yang dihasilkan di-commit ke repositori, lalu perubahan CI dikembalikan
- Masalah selesai
Kesimpulan
- GitHub Actions menjadi alasan mengapa beberapa hal bagus tidak bisa dimanfaatkan
- Banyak waktu terbuang untuk debugging runner atau mengoptimalkan proses build
- Namun, tetap ada keuntungan seperti build macOS yang sulit didapat dengan cara lain
- Tentu saja, juga belum diketahui ada sistem lain yang lebih mudah disiapkan daripada GitHub Actions
We are all doomed to GitHub Actions. …but at least I dodged the bullet early.
3 komentar
GitHub Actions seharusnya hanya untuk menyiapkan environment (OS, toolchain build, …) dan menjalankan skrip (shell, Python, bat, ps1…). Meski GitHub down, selama environment-nya siap, build harus bisa dilakukan di mana saja. Kalau lihat workflow GitHub Actions belakangan ini, rasanya jadi berpikir apa perlu sampai repot-repot mencari dan memakai hal seperti itu. Dulu sekali (?) Ansible juga begitu lalu gagal.
Komentar Hacker News
Masalah inti GitHub Actions adalah loop umpan baliknya terlalu lambat
Sangat menjengkelkan harus push lalu menunggu hanya untuk mengecek kegagalan sederhana
Menurut saya, sebaiknya pekerjaan CI dipisahkan menjadi skrip yang bisa dijalankan secara lokal, dan fitur Actions hanya dipakai sebagai peningkatan bertahap
Kombinasi
workflow_dispatchdangh workflow runjuga lumayan, tetapi sangat merepotkan karena yang terakhir tidak langsung memberikan URL workflow yang dijalankanCukup berhasil untuk mendapatkan umpan balik cepat
Jika ada masalah, saya bisa melakukan debugging dalam kondisi yang hampir sama dengan lingkungan GitHub Actions
Itu seharusnya menjadi persyaratan dasar semua sistem CI
Pada akhirnya yang penting adalah fitur seperti antrean, analisis output, dan telemetri riwayat build
gh workflow run, untuk mendapatkan URL saya harus memuat ulang daftar eksekusi workflow lewat GitHub APIKalau ada beberapa eksekusi sekaligus memang bisa berantakan, tetapi sejauh ini cukup berjalan
Saya merangkum beberapa tips desain CI
Shell sederhana seharusnya sudah cukup
Ada baiknya mendefinisikan target CI di
Makefile, lalu memanggilnya sesederhanamake ci-testSejak itu saya mengelola semua CI dengan wrapper sederhana seperti
make buildAkan bagus jika bisa dibedakan dengan penanda seperti
BeginStep("Step Name")Masalahnya bukan GitHub Actions itu sendiri, melainkan otomatisasi yang ditumpuk secara berantakan di atasnya
Logika seharusnya dijadikan skrip dalam bahasa seperti Python agar bisa dijalankan juga secara lokal
Setiap kali harus mengubah workflow, push, lalu menunggu
Saya memproses semua CI di dalam container
Platform CI hanya menjalankan container itu, jadi hal yang sama bisa dijalankan lokal juga
Platform-platform tidak menyukai pendekatan seperti ini, karena vendor lock-in mereka jadi rusak
Saat gagal, saya bisa langsung masuk via SSH untuk debugging, dan bisa mengubah manifest lalu menjalankannya ulang tanpa push branch
Hanya saja perlu self-hosting
Standardisasi jadi lebih mudah, tetapi ada trade-off berupa perawatan image
Praktis sebenarnya tidak ada lock-in, tetapi orang-orang terjebak dalam cargo cult CI/CD
Saya suka GitHub Actions
Ini lebih baik daripada Travis yang dulu saya pakai, dan sangat berguna sebagai sumber daya gratis untuk proyek OSS
Setelah mengadopsi Nix, reproduksibilitas lingkungan meningkat sehingga kecocokannya dengan Actions jadi jauh lebih baik
Container yang dibuat dengan flake bisa langsung dijalankan di Actions
Contoh proyek
Menurut saya, GitHub Actions seharusnya hanya menjadi struktur untuk memanggil skrip bash atau python
Bash punya banyak keterbatasan, Python lebih fleksibel dan juga mudah dijalankan secara lokal
Pendekatan seperti dalam artikel ini—menginstal uv otomatis dan mengelola dependensi—terasa ideal
Memang lebih rumit daripada bash, tetapi di lingkungan Actions dampak performanya tidak terlalu besar
Masalah terbesar Actions adalah cara pemasarannya yang bilang “susun saja workflow”
Debugging hampir mustahil, dan pengaturan cache merepotkan sehingga build menjadi lambat
Karena itulah pendekatan menjalankan langsung di VM persisten terasa menarik
Saya adalah pendiri Depot
Saya menjalankan layanan yang menyediakan runner GitHub Actions yang lebih cepat dan lebih murah
Keluhan yang dirasakan banyak orang memang benar-benar merupakan pendapat mayoritas
Sistem Actions secara struktural tidak efisien, dan tiap minggu kami menemukan bottleneck baru
Saya yakin ada cara yang lebih baik, dan kami sedang bereksperimen dengannya
Cerita lebih lengkap bisa dilihat di depot.dev
Akhir pekan lalu saya membuat alat bernama
gg watch actionIni adalah alat untuk menemukan action terbaru atau yang sedang berjalan pada branch saat ini
Link GitHub
gh”Hanya saja ada bug di perintah
gg tuiyang membuat repositori tidak terlihatSaya penasaran apakah alat seperti
actbisa membantunektos/act
Karena perbedaan arsitektur, eksekusi lokal dan online bisa saja berbeda, tetapi tetap terlihat berguna
Kompatibilitasnya sekitar 80%
SourceHut mendukung ini, jadi benar-benar praktis
Sepertinya ini adalah masalah yang tak terhindarkan karena strukturnya mengharuskan logika dimasukkan ke dalam YAML.
Tulisan di atas tampaknya kurang lebih sudah memberi jawabannya seperti di bawah ini, tetapi rasanya kalau bagian skrip diganti dengan Dagger, justru itulah jawaban yang tepat.
"Jangan biarkan GitHub Actions mengelola logika; kendalikan sendiri skripnya, dan biarkan Actions hanya memanggil skrip tersebut"