GoReleaser
GoReleaser는 Go 프로젝트의 릴리스 과정을 자동화하는 도구다. 바이너리 빌드, 아카이브 패키징, Docker 이미지 생성, 패키지 매니저 배포, 체인지로그 생성까지 하나의 설정 파일로 관리한다.
최신 버전: v2.15.2 (2026년 3월 31일) 라이선스: MIT (OSS) / 유료 구독 (Pro)
왜 GoReleaser인가
Go 바이너리를 릴리스하려면 보통 이런 작업이 필요하다:
- 여러 OS/아키텍처 조합으로 크로스 컴파일
- tar.gz / zip으로 아카이브
- 체크섬 파일 생성
- GitHub/GitLab Release에 업로드
- Homebrew formula, Scoop manifest 등 패키지 매니저 배포
- Docker 이미지 빌드 & 푸시
- 체인지로그 생성
이걸 쉘 스크립트로 직접 짜면 수백 줄이 되지만, 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가 아닌 프로젝트도 동일한 릴리스 파이프라인을 사용할 수 있다.