Go CLI aracını GoReleaser ve Homebrew ile çoklu platforma nasıl dağıtırım?
Soru
Go ile yazdığımız bir CLI aracımız var (mesela CommitBrief). Hem macOS (M1/M2/Intel) hem Linux kullanıcıları `brew install` ile kolayca kurabilsin istiyorum. GitHub Actions'ta GoReleaser kullanarak her tag'de binary derleyen, GitHub Releases'e yükleyen ve özel bir Homebrew Tap reposunu otomatik güncelleyen CI/CD akışını nasıl kurarım?
Cevap
Kısa cevap: Bu tam olarak GoReleaser’ın çözdüğü problem — bir .goreleaser.yaml + tag’de tetiklenen tek bir workflow, hem cross-compile’ı hem GitHub Release’i hem de Homebrew tap formülünü otomatik halleder.
Kısa cevap
Sizin yapmanız gereken tek şey paketleme zincirini elinizden bırakmak; gerisini GoReleaser üstlenir. Aracın kendisini yazma tarafını Go’da ilk CLI aracımı anlattığım yazıda ele almıştım; buradaki soru o binary’yi kullanıcının makinesine nasıl ulaştıracağınız.
Neden
-
Çoklu platform elle yönetilecek bir iş değil.
darwin/arm64,darwin/amd64,linux/amd64,linux/arm64— her hedefi elle derleyip arşivlemek, checksum üretmek ve Release’e yüklemek her sürümde tekrar eden bir emektir; GoReleaser bunu tek bir konfigürasyona indirir. -
Tap ayrı bir repo olduğu için varsayılan token yetmez. Formül
homebrew-tapreposunda yaşar; varsayılanGITHUB_TOKENbaşka repoya yazamaz, o yüzden ayrı bir token şart. -
Bozuk config en kötü anda, release anında patlar. Tag atıldıktan sonra fark edilen bir konfigürasyon hatası sürümü yarıda bırakır; bu yüzden doğrulamayı release’e değil PR’a taşımak gerekir.
Ne yapmalı
-
.goreleaser.yaml’da build matrisini tanımlayın.darwin/arm64,darwin/amd64,linux/amd64,linux/arm64hedeflerini yazın. İstersenizuniversal_binariesile macOS için tek bir evrensel artefakt üretin; M1/M2/Intel ayrımı kullanıcı tarafında kaybolur. -
Tag push’unda tetiklenen bir GitHub Actions workflow’u kurun.
on: push: tags: ['v*']ilegoreleaser releaseçalışsın: cross-compile eder, arşivleri + checksum’ları üretir, GitHub Release’i yayımlar. -
homebrew_casks:bloğuyla tap’i otomatik güncelleyin. Bu blok, cask’i ayrı birhomebrew-tapreposuna commit eder. Kullanıcı sonrabrew install seninadin/tap/cliile kurar. İhtiyacınız olan: tap reposuna push yetkisi olan bir PAT. (Eskibrews:bloğu GoReleaser v2.10’dan beri deprecated; hâlâ çalışıyor ama yeni kurulumlardahomebrew_casks:kullanın.) -
Sürüm bilgisini binary’ye gömüp config’i CI’da doğrulayın.
ldflagsile version/commit/date stamp’leyin kicli --versiondoğru bilgi versin. Pipeline’agoreleaser checkekleyin — config bozuksa release anına kalmadan, daha PR’da yakalarsınız.
Sonuç: Tag atın, gerisini GoReleaser yapsın — Releases + tap formülü tek komutla çıkar, manuel paketleme tamamen ortadan kalkar. Bu, Go ekosisteminde fiili standart; siz sadece tag disiplinini ve ayrı tap token’ını kurarsanız akış kendi kendine döner. CLI’yı paketleyip dağıtmanın daha geniş resmini hub yazısında ele aldım; oradaki dağıtım modelini bu workflow’a oturtursunuz.
İlgili Yazılar
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.