My External Storage

Oct 7, 2020 - 4 minute read - Comments - go

goreleaserとGitHub Actionsを使えばGoのCLIはgit tagをpushするだけでGitHubとHomeBrewに自動リリースできる

goreleaserを使うとGo製のCLIのGitHubのリリースページの更新とHomeBrew Tap用リリースも簡単に行える。
さらにGitHub Actionsを使えばYAMLを2ファイル追加するだけでgit tagに合わせて全自動リリースが可能になる。

TL;DR

  • goreleaserはGoのバイナリをよしなにリリースできるツール
    • https://goreleaser.com/
    • GitHubのリリースページにリリースできる
    • HomeBrew Tapにもリリースできる
  • GitHub Actionsも公式で提供されている
  • Actionsを使えばgit tagをpushするだけで自動リリースできる

GoのCLIを自動リリースしたい

GoでCLIのインストール方法は(Macの場合)主に次の3つになるだろう。

  • go getでインストールする
  • GitHubのリリースページなどにあるバイナリをインストールする
  • HomeBrewでインストールする

goreleaserを使うと、GitHubリリースページへのバイナリアップロードやHomeBrew用の設定ファイルの作成がとても簡単になる。

git tagに合わせてgoreleaser-actionを使って自動リリースをする。

GitHubへの自動リリースの手順はほとんど次の記事で説明されている。

これに加えて、HomeBrew Tap用の設定をすればローカルに何も用意せず、HomeBrew Tap用リポジトリのRubyのファイルも自動生成・自動更新される。

必要なもの

自動リリースに必要なのは次の通り。

goreleaserの設定YAMLを用意する

まずはリリースの設定をしたYAMLファイルを用意する。
公式ページを確認すればよいが、ほぼコピペで問題ない。

以下のYAMLはleetgodeというCLIをリリースする際に利用しているYAMLファイルだ。

before:
  hooks:
    - go mod tidy # tidyしておけば間違いない
builds:
  -
    main: ./cmd/leetgode # main.goファイルがある場所。
    env:
      - CGO_ENABLED=0
archives:
  - replacements:
      darwin: Darwin
      linux: Linux
      windows: Windows
      386: i386
      amd64: x86_64
checksum:
  name_template: 'checksums.txt'
snapshot:
  name_template: "{{ .Tag }}-next"
changelog:
  sort: asc
  filters:
    exclude:
      - '^docs:'
      - '^test:'

HomeBrew Tap用の設定は以下のとおり。これを.goreleaser.ymlに追加しておく。
いろいろ設定したいならば公式情報を参照すればよいがこちらもほぼコピペで大丈夫。

brews:
  -
    name: leetgode # CLIの名前でよい
    github: # HomeBrew Tapをリリースするリポジトリ
      owner: budougumi0617
      name: homebrew-tap
    # ここは決め打ちで良い
    url_template: "https://github.com/budougumi0617/leetgode/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
    commit_author: # homebrew-tapにcommitするときに使うGitHubアカウント
      name: goreleaserbot
      email: goreleaser@carlosbecker.com
    homepage: "https://budougumi0617.github.io/"
    description: "LeetCode CLI for Gophers."     # 適当なdescription
    test: | # リリースビルド後の動作確認用のコマンド。--versionやhelpなどを指定すればよいだろう
      system "#{bin}/leetgode help"
    install: |  # Goならばバイナリ名でOK
      bin.install "leetgode"

GitHub Actionsの設定をする。

あとはGitHub Actionsを設定しておけば、自動リリースができる。

次の内容のYAMLファイルを.github/workflows/goreleaser.ymlに設置する。
こちらの参考YAMLもleetgode CLIで使っているものだ。

name: goreleaser

on:
  push:
    tags: #vX.X.Xというタグのときにリリースする
      - "v[0-9]+.[0-9]+.[0-9]+"
jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      -
        name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.15
      -
        name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v2
        with:
          version: latest
          args: release --rm-dist
        env:
          # need to access other repository for brew-tap
          GITHUB_TOKEN: ${{ secrets.GH_PAT }}

HomeBrew Tap用のリポジトリへの書き込み権限が必要なため、トークンを作っておかないといけない点だけ注意する。
上記の例では、リポジトリのシークレットにGH_PATという名前で払い出したトークンを設定している。
やりかたは次のページを参照のこと。

動作確認

ここまで設定すればあとはすべて自動で実行される。
tagを設定してリモートへプッシュすると、

$ git tag -a v0.0.1 -m "first release"
$ git push origin v0.0.1

GitHub Actionsが実行される。

Actionsが実行されると、GitHub Releaseが作成される。

また、HomeBrew Tap用のリポジトリにRubyの設定ファイルが自動追加される。

ローカルでbrewコマンドを実行すると、リリースしたバイナリがインストールできるようになっている。

$ brew install budougumi0617/tap/leetgode

終わりに

GitHub Actions用のリポジトリができていたのでリリース作業がめちゃくちゃ簡単になった!
そして設定もYAMLをコピペするだけでいいのでめちゃくちゃ簡単。
CLIツールはちょくちょくつくるしmacOSユーザなので自分がラクするためにも積極的に使っていきたい。

参考

関連記事