GoReleaser

GoReleaser는 Go 프로젝트의 릴리스 과정을 자동화하는 도구다. 바이너리 빌드, 아카이브 패키징, Docker 이미지 생성, 패키지 매니저 배포, 체인지로그 생성까지 하나의 설정 파일로 관리한다.

최신 버전: v2.15.2 (2026년 3월 31일) 라이선스: MIT (OSS) / 유료 구독 (Pro)


왜 GoReleaser인가

Go 바이너리를 릴리스하려면 보통 이런 작업이 필요하다:

  1. 여러 OS/아키텍처 조합으로 크로스 컴파일
  2. tar.gz / zip으로 아카이브
  3. 체크섬 파일 생성
  4. GitHub/GitLab Release에 업로드
  5. Homebrew formula, Scoop manifest 등 패키지 매니저 배포
  6. Docker 이미지 빌드 & 푸시
  7. 체인지로그 생성

이걸 쉘 스크립트로 직접 짜면 수백 줄이 되지만, GoReleaser는 .goreleaser.yaml 하나로 끝낸다.


기본 사용법

설치

# Homebrew
brew install goreleaser/tap/goreleaser

# Go install
go install github.com/goreleaser/goreleaser/v2@latest

# Snap
sudo snap install --classic goreleaser

초기 설정

goreleaser init

.goreleaser.yaml이 생성된다. goreleaser check로 설정 유효성을 검증할 수 있다.

릴리스 실행

# 실제 릴리스 (태그 필요)
goreleaser release --clean

# 로컬 테스트 (publish 안 함)
goreleaser release --snapshot --clean

설정 파일 구조

version: 2

builds:
  - env:
      - CGO_ENABLED=0
    goos:
      - linux
      - darwin
      - windows
    goarch:
      - amd64
      - arm64

archives:
  - formats:
      - tar.gz
    format_overrides:
      - goos: windows
        formats:
          - zip

checksum:
  name_template: 'checksums.txt'

changelog:
  sort: asc
  filters:
    exclude:
      - '^docs:'
      - '^test:'

brews:
  - repository:
      owner: myorg
      name: homebrew-tap

dockers:
  - image_templates:
      - "myorg/myapp:{{ .Tag }}"
      - "myorg/myapp:latest"

주요 섹션

섹션 역할
builds Go 바이너리 크로스 컴파일 설정 (OS, arch, ldflags 등)
archives 빌드 결과물을 tar.gz/zip으로 패키징
checksum SHA256 체크섬 파일 생성
changelog 커밋 기반 체인지로그 자동 생성
brews Homebrew formula 자동 생성 & 푸시
scoops Windows Scoop manifest 생성
nix Nix derivation 생성
snaps Snap 패키지 생성 (Ubuntu Store 배포)
dockers Docker 이미지 빌드 & 푸시
signs GPG/cosign 서명
sboms SBOM(Software Bill of Materials) 생성

v2 마이그레이션

v2는 v1.26.2에서 deprecated 옵션을 제거한 버전이다. 기능적으로 거의 동일하며, 설정 파일에 version: 2를 추가하면 된다.

# v1 → v2: 이 한 줄만 추가
version: 2

deprecated 옵션을 사용 중이었다면 goreleaser check로 확인하고 수정하면 된다.


v2.14 ~ v2.15 주요 변경사항

변경 내용
Air-Gapped 환경 지원 license-export / license-verify 명령으로 오프라인 환경 릴리스 가능
Nightly 체인지로그 Nightly 빌드에서도 GitHub/GitLab/Gitea 체인지로그 구현 사용 가능
Docker 개선 platforms 필드 템플릿 지원, daemonless snapshot 빌드 개선
Homebrew Cask manpage glob 지원, wrap_in_directory 관련 수정
Nix 개선 동적 링크 바이너리 감지 시 autoPatchelfHook 자동 적용
macOS .pkg (Pro) .pkg 인스톨러 생성, 서명, 공증(notarize) 지원

GitHub Actions 연동

name: Release
on:
  push:
    tags:
      - "*"

permissions:
  contents: write

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0  # GoReleaser에 전체 git history 필요

      - uses: actions/setup-go@v5
        with:
          go-version: stable

      - uses: goreleaser/goreleaser-action@v7
        with:
          distribution: goreleaser
          version: "~> v2"
          args: release --clean
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

fetch-depth: 0은 필수다. GoReleaser가 태그 히스토리를 읽어서 체인지로그를 생성하기 때문이다.


배포 대상

GoReleaser가 자동으로 배포할 수 있는 대상:

대상 설명
GitHub Releases 바이너리 + 체인지로그 업로드
GitLab Releases GitHub과 동일
Homebrew macOS/Linux 패키지 매니저 formula 자동 생성
Scoop Windows 패키지 매니저 manifest 생성
Winget Windows Package Manager manifest 생성
Nix Nix derivation 생성
Snap Ubuntu Store 배포용 snap 패키지
AUR Arch Linux User Repository
Docker Hub / GHCR Docker 이미지 빌드 & 푸시
CloudSmith (Pro) APT/YUM 레포지토리

OSS vs Pro

기능 OSS Pro
크로스 컴파일 & 아카이브 O O
GitHub/GitLab Release O O
Homebrew / Scoop / Nix O O
Docker 이미지 O O
GPG / cosign 서명 O O
SBOM 생성 O O
macOS .pkg / .dmg / .app X O
Windows .exe (NSIS) / .msi (Wix) X O
NPM 레지스트리 배포 X O
macOS 서명 & 공증(notarize) X O
AI 기반 릴리스 노트 개선 X O
조건부 아티팩트 필터링 (if) X O
Air-Gapped 환경 지원 X O

대부분의 Go 프로젝트는 OSS로 충분하다. macOS/Windows 인스톨러가 필요하거나 엔터프라이즈 환경이면 Pro를 고려.


Go 이외의 언어 지원

GoReleaser는 이름과 달리 Rust와 Zig 프로젝트도 지원한다. builds 섹션에서 빌더를 지정하면 Go가 아닌 프로젝트도 동일한 릴리스 파이프라인을 사용할 수 있다.


참고