自作ツールで使っているGoReleaserをバージョン2にアップグレードしてみた

自作ツールで使っているGoReleaserをバージョン2にアップグレードしてみた

Clock Icon2024.09.03

しばたです。

私は過去にGo言語製の簡単なツールを公開し現在もメンテナンスを続けています。

https://dev.classmethod.jp/articles/i-create-ec2rdp-command/

https://github.com/stknohg/ec2rdp

このツールのリリースにGoReleaserを使っているのですが、先日久しぶりにツールのバージョンアップをしたところGitHub Actionsのジョブで以下の警告が出る様になっていました。

Warning: You are using 'latest' as default version. Will lock to '~> v1'.

how-to-upgrade-goreleaser-v2-01

調べてみたところ今年の6月にGoReleaserのメジャーバージョンアップとなるv2がリリースされており、それが直接の原因だったのでツールで使用するGoReleaserのバージョンを上げることで対応しました。

本記事ではこの詳細を共有したいと思います。

GoReleaser v2について

GoReleaserのメジャーバージョンアップに関しては以下のブログでアナウンスされています。

https://goreleaser.com/blog/goreleaser-v2/

こちらによればGoReleaser v2はv1系の最終版となるv1.26.2とほぼ同等であり、非推奨のオプションを削除した点のみ異なるそうです。

このため基本的には非推奨の記述を新しいものに置き替えるだけでアップグレードできるはずです。

ローカル環境のアップグレード

ここから実際に行った作業を解説していきます。

まず最初にローカル環境のGoReleaserのバージョンアップを行います。
こちらはインストール方法に応じたやり方でアップグレードしてください。

私の場合はWindows 11環境でScoopを使っているのでscoop updateコマンドで最新バージョンに更新しました。

# ローカルGoreleaserの更新は環境に応じて行ってください。

# Scoopを使っている場合は scoop update コマンドで更新
scoop update goreleaser

本日時点での最新はVer.2.2.0となります。

how-to-upgrade-goreleaser-v2-02

次に.goreleaser.yamlのあるディレクトリに移動し、goreleaser checkコマンドを使い既存の設定内容を検証します。

# goreleaser checkコマンドで .goreleaser.yaml を検証
goreleaser check

非推奨の記述がある場合はここで警告やエラーとなります。
私のツールの場合だと下図の結果となり、2点修正が必要でした。

how-to-upgrade-goreleaser-v2-03

# 修正が必要なエラーメッセージを抜粋
• only configurations files on  version: 2  are supported, yours is  version: 0 , please update your configuration

• DEPRECATED:  snapshot.name_template  should not be used anymore, check https://goreleaser.com/deprecations#snapshotnametemplate for more info

修正1 : ファイルバージョンの指定

GoReleaser v2から.goreleaser.yamlにバージョン識別のヘッダが増えました。
YAMLファイルの先頭に以下のバージョン指定を追加すると警告が解消されます。

.goreleaser.yaml
# バージョン識別のヘッダを追加
version: 2

修正2 : 非推奨の記述を最新化

GoReleaserではv1の頃から随時設定の記述が改められ古い記述が非推奨となっています。

非推奨の一覧は以下のページにまとめられているので適宜新しい内容に更新してやります。

https://goreleaser.com/deprecations/#deprecation-notices

私のツールの場合だと以前にいくつか対応済みだったため、今回はsnapshot.name_templateの記述を修正するだけで済みました。

.goreleaser.yaml
# 旧 : 非推奨
snapshot:
  name_template: 'foo'

# ↓

# 新 : v2.2以降の記法
snapshot:
  version_template: 'foo'

対応結果の確認

指摘事項を修正して最終的にgoreleaser checkがエラー無く完了すれば対応完了です。

# エラーが無くなるまで goreleaser check を繰り返す
goreleaser check

how-to-upgrade-goreleaser-v2-04

私のツールの.goreleaser.yamlの最終形はこちらになります。

クリックして展開
.goreleaser.yaml
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
# vim: set ts=2 sw=2 tw=0 fo=cnqoj
version: 2
before:
  hooks:
    - go mod tidy
builds:
  - env:
      - CGO_ENABLED=0
    goos:
      - windows
      - darwin
    goarch:
      - amd64
      - arm64
    flags:
      - -trimpath
    ldflags:
      - -w -s
      - -X "github.com/stknohg/ec2rdp/cmd.cmdVersion={{.Version}}"
archives:
  - format: tar.gz
    # this name template makes the OS and Arch compatible with the results of uname.
    name_template: >-
      {{ .ProjectName }}-
      {{- tolower .Os }}-
      {{- if eq .Arch "amd64" }}x64
      {{- else if eq .Arch "386" }}i386
      {{- else }}{{ .Arch }}{{ end }}
      {{- if .Arm }}v{{ .Arm }}{{ end }}
    # use zip for windows archives
    format_overrides:
    - goos: windows
      format: zip
checksum:
  name_template: 'checksums.txt'
snapshot:
  version_template: "{{ incpatch .Version }}-next"
changelog:
  sort: 
  filters:
    exclude:
      - '^docs:'
      - '^test:'
      - '^fix.{0,1}$'
brews:
  - 
    description: "Remote Desktop Utility for Amazon EC2."
    homepage: "https://github.com/stknohg/ec2rdp"
    license: "MIT"
    directory: Formula
    repository:
      owner: stknohg
      name: homebrew-tap
      branch: main
      token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}"
scoops:
  - 
    description: "Remote Desktop Utility for Amazon EC2."
    homepage: "https://github.com/stknohg/ec2rdp"
    license: "MIT"
    directory: bucket
    url_template: "https://github.com/stknohg/ec2rdp/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
    shortcuts: [["ec2rdp.exe", "ec2rdp"]]
    repository:
      owner: stknohg
      name: scoop-bucket
      branch: main
      token: "{{ .Env.SCOOP_BUCKET_GITHUB_TOKEN }}"

ローカルビルドのチェック

次にこの状態でローカルビルドを行いエラーが出ないかチェックします。

goreleaser release --snapshot --clean

how-to-upgrade-goreleaser-v2-05

エラーが出る様であれば適宜対応します。
今回は特にエラー無く完了しました。

これでローカル環境の更新は完了です。

GitHub Actionsの更新

GitHub Actionsを使ってリリース作業を自動化している場合は次の手順が必要となります。

goreleaser/goreleaser-actionは現在最新のv6からデフォルトのGoReleaserがv2になっています。
このため基本的にアクションのバージョンを上げてやるだけでOKです。

最初に紹介したブログではGoReleaserのバージョン指定を~> v2にしており、v2利用の明示を推奨してたので一緒に対応すると良いでしょう。

同ブログにある設定例を以下に紹介しておきます。

GitHub Actionsの設定例 (.github/workflows/release.yml)
# ...
jobs:
  goreleaser:
    # ...
    - uses: goreleaser/goreleaser-action@v6
      with:
        distribution: goreleaser # or 'goreleaser-pro'
        version: "~> v2" # or 'latest', 'nightly', semver
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        # GORELEASER_KEY: ${{ secrets.GORELEASER_KEY }} # if using goreleaser-pro

最後に

以上となります。

メジャーバージョンアップといっても非推奨のオプションを廃止しただけなので大きく困ることは無いはずです。
私の場合アップグレード前がv1.25だった事もありサクッと完了しました。
古いバージョンを使っている場合は一度v1.26.2にしてからv2にアップグレードするのも良いかもしれません。

本記事の内容が誰かの役に立てば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.