# Go CLI aracını GoReleaser ve Homebrew ile çoklu platforma nasıl dağıtırım?

> Tag push'unda tetiklenen tek bir workflow cross-compile edip Release'i yayımlasın, brews: bloğu tap formülünü güncellesin; tap için ayrı bir PAT şart.

- Soruldu: 2026-06-11
- Yanıtlandı: 2026-06-12
- Soran: Devrim
- Etiketler: ci-cd, go
- Kaynak: https://www.muhammetsafak.com.tr/sor-bakalim/go-cli-aracini-goreleaser-ve-homebrew-ile-dagitmak/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
**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?


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.

Sizin yapmanız gereken tek şey paketleme zincirini elinizden bırakmak; gerisini GoReleaser üstlenir.

1. **`.goreleaser.yaml`'da build matrisini tanımlayın.** `darwin/arm64`, `darwin/amd64`, `linux/amd64`, `linux/arm64` hedeflerini yazın. İsterseniz `universal_binaries` ile macOS için tek bir evrensel artefakt üretin; M1/M2/Intel ayrımı kullanıcı tarafında kaybolur.
2. **Tag push'unda tetiklenen bir GitHub Actions workflow'u kurun.** `on: push: tags: ['v*']` ile `goreleaser release` çalışsın: cross-compile eder, arşivleri + checksum'ları üretir, GitHub Release'i yayımlar.
3. **`brews:` bloğuyla tap formülünü otomatik güncelleyin.** Bu blok, formülü ayrı bir `homebrew-tap` reposuna commit eder. Kullanıcı sonra `brew install seninadin/tap/cli` ile kurar. İhtiyacınız olan: tap reposuna push yetkisi olan bir PAT (varsayılan `GITHUB_TOKEN` başka repoya yazamaz, ayrı token şart).
4. **Sürüm bilgisini binary'ye gömüp config'i CI'da doğrulayın.** `ldflags` ile version/commit/date stamp'leyin ki `cli --version` doğru bilgi versin. Pipeline'a `goreleaser check` ekleyin — 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

- [Go ile yazdığım bir komut satırı aracını paketlemek ve dağıtmak](/blog/go-ile-komut-satiri-aracini-paketlemek-ve-dagitmak/) — Blog
- [Birbirine bağımlı birden fazla işi, ilk hata hepsini iptal edecek şekilde errgroup ile mi yürütmeliyim?](https://www.muhammetsafak.com.tr/sor-bakalim/birbirine-bagimli-birden-fazla-isi-ilk-hata-hepsini-iptal-edecek-sekilde/) — Sor Bakalım
- [İç içe geçmiş servis çağrılarında context iptalini doğru şekilde nasıl yayarım?](https://www.muhammetsafak.com.tr/sor-bakalim/ic-ice-gecmis-servis-cagrilarinda-context-iptalini-dogru-sekilde-nasil-yayarim/) — Sor Bakalım
- [Goroutine sızıntılarını uzun süre çalışan bir Go servisinde nasıl tespit edip önlerim?](https://www.muhammetsafak.com.tr/sor-bakalim/goroutine-sizintilarini-uzun-sure-calisan-bir-go-servisinde-nasil-tespit-edip/) — Sor Bakalım
