# 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, homebrew_casks: bloğu tap'i 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://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.

## 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](/tr/blog/goda-ilk-cli-aracimi-yazmak/) ele almıştım; buradaki soru o binary'yi kullanıcının makinesine nasıl ulaştıracağınız.

## Neden

1. **Ç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.

2. **Tap ayrı bir repo olduğu için varsayılan token yetmez.** Formül `homebrew-tap` reposunda yaşar; varsayılan `GITHUB_TOKEN` başka repoya yazamaz, o yüzden ayrı bir token şart.

3. **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ı

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. **`homebrew_casks:` bloğuyla tap'i otomatik güncelleyin.** Bu blok, cask'i 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. (Eski `brews:` bloğu GoReleaser v2.10'dan beri deprecated; hâlâ çalışıyor ama yeni kurulumlarda `homebrew_casks:` kullanın.)

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](/tr/blog/go-ile-komut-satiri-aracini-paketlemek-ve-dagitmak/) — Blog
- [Kanal tampon boyutu seçimi backpressure sorunlarını gizler mi, nasıl karar vermeliyim?](https://muhammetsafak.com/tr/sor-bakalim/kanal-tampon-boyutu-backpressure-sorunlarini-gizler-karar-vermeliyim/) — Sor Bakalım
- [Container'daki Go worker'ım SIGTERM almıyor ve graceful kapanmıyor, bu bir PID 1 sorunu mu?](https://muhammetsafak.com/tr/sor-bakalim/containerdaki-go-workerim-sigterm-almiyor-pid-1-sorunu/) — Sor Bakalım
- [Birbirine bağımlı birden fazla işi, ilk hata hepsini iptal edecek şekilde errgroup ile mi yürütmeliyim?](https://muhammetsafak.com/tr/sor-bakalim/birbirine-bagimli-birden-fazla-isi-ilk-hata-hepsini-iptal-edecek-sekilde/) — Sor Bakalım
