goreleaser を使って GitHub でリリースを作成したい

最終更新日:





goreleaser を使って GitHub Actions で自動でリリースしたい。

GitHub Actions のドキュメント

goreleaser のドキュメント





ディレクトリ構成

.
├── .github
│  └── workflows
│     ├── go.yml
│     └── release.yml
├── .goreleaser.yaml
├── cmd
│  └── example-cli
│     └── main.go
├── example.go
├── go.mod
├── LICENSE
└── README.md

.goreleaser.yaml

goreleaser init すれば .goreleaser.yaml が作成されるのでドキュメントを見ながら適宜書き換える。

version: 2

before:
  hooks:
    - go mod tidy

builds:
  - main: ./cmd/example-cli/
    binary: example-cli
    ldflags:
      - -s -w
      - -X main.Name={{.ProjectName}}
      - -X main.Version={{.Version}}
    env:
      - GO111MODULE=on
      - CGO_ENABLED=0
    goos:
      - linux
      - windows
      - darwin

archives:
  - format: tar.gz
    name_template: >-
      {{ .ProjectName }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else }}{{ .Arch }}{{ end }}
      {{- if .Arm }}v{{ .Arm }}{{ end }}
    format_overrides:
      - goos: windows
        format: zip
    files:
      - LICENSE

checksum:
  name_template: "checksums.txt"
  algorithm: sha256

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



.github/workflows/release.yml

以前のバージョンで使ってた release –rm-dist は release –clean に置き換える。 テストが通った場合にのみリリースを作成したいので、バージョンを示すタグが push された場合にリリースが作成されるように “v[0-9]+*” と記述してある。

name: Release

on:
  push:
    tags:
      - "v[0-9]+*"

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: 1.22.x

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



goreleaser ローカルでのビルド手順

ローカルにインストールしている場合は以下の手順でビルドできる。

  1. .goreleaser.yaml ファイルの生成 (.gitignoredist/ が追記される)
$ goreleaser init
  1. YAMLファイルの整合性/構文チェック
$ goreleaser check
• checking                                 path=.goreleaser.yaml
• 1 configuration file(s) validated
• thanks for using goreleaser!
  1. ローカルでビルドする
$ goreleaser



403 Resource not accessible by integration エラーが出る場合の対処法

error=scm releases: failed to publish artifacts: could not release: POST: 403 Resource not accessible by integration []

リポジトリの設定から Settings -> Actions -> General -> Workflow permissionsRead and write permissions にチェックを入れる。

Workflow permissions

Choose the default permissions granted to the GITHUB_TOKEN when running workflows in this repository. You can specify more granular permissions in the workflow using YAML. Learn more about managing permissions.
● Read and write permissions
Workflows have read and write permissions in the repository for all scopes.
○ Read repository contents and packages permissions
Workflows have read permissions in the repository for the contents and packages scopes only.

これに限らずワークフロー/アクションズで 403: Resource not accessible by integration のエラーメッセージが出る場合は上記の権限を与える必要がある。



コメント