二度忘れた事を三度忘れないようにする

しがないフリーランスIT系エンジニア

Goreleaserを使ってGithub Actionsを使ってみた

前回はGithubActionsをそのまま使って、ビルドからリリース作成・ファイルのアップロードをやってみましたが、これらの処理をお手軽かつよしなにしてくれるのがGoreleaserです。

では前回のワークフローファイルを全部消したらスタートです。
まず、ワークフローファイルの作成ですが、公式ドキュメントにあるものをそのままコピペします。

name: goreleaser

on:
  pull_request:
  push:

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
      -
        name: Unshallow
        run: git fetch --prune --unshallow
      -
        name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.14
      -
        name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v2
        with:
          version: latest
          args: release --rm-dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

トリガーだけ、前回同様にタグが付いた時などに変更してよいでしょう。
ちなみにmain.goがプロジェクトルートに無い場合goreleaserアクションを呼んでいるステップのwithworkdirを追加して指定することができます。

次にGoプロジェクトのルートに.goreleaser.ymlを設置します。
なお、Goreleaserはコマンドラインで使うこともでき、その際に必要なのがこの.goreleaser.ymlで、上記のワークフローファイルはGithubActionsを動かすのに必要なモノで別物なのです。GithubActionsで呼ばれているアクション経由でこの.goreleaser.ymlが使われる形になります。

参考までにコマンドラインで初期化した際に生成される.goreleaser.ymlは以下です。(記事投稿時)

before:
  hooks:
    # You may remove this if you don't use go modules.
    - go mod download
    # you may remove this if you don't need go generate
    - go generate ./...
builds:
- 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:'

公式ドキュメントに使える設定が書いているのでさらっと見ておくことをお勧めします。
今回、この.gorelease.ymlを以下のように変更します。

project_name: YourProjectName

builds:
  - ldflags:
      - -s -w

archives:
  - name_template: '{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}'
    replacements:
      386: i386
      amd64: x86_64
    format_overrides:
      - goos: windows
        format: zip

project_nameは指定しなくてもGithubやGitlabから自動的に取ってくるようですが、指定したほうが確実にこの値になるので指定しています。
buildsにビルドに関わるアレコレを記述していきます。今回は最小限の内容で、おまじないとしてldflags-s -wを入れておきます。(詳しくはこちらなど)
archivesはリリースへアップロードするファイルに関する設定ができます。 name_templateGolangのtemplateに沿って記述が出来るので、ドキュメントに無いif文等も使えるようです。
replacementsGOOSGOARCHの文字列を置換する設定です。特にこだわりがなければ記述無しでOKです。
format_overridesは「Windowsではzipで配布したい」というときに、このようにGOOSとフォーマットを設定すると、対応したOSだけデフォルトのtar.gzからzipへ変更できます。

ちなみに今回はGo1.14を使っている(ワークフローのファイルで指定している)ので、環境変数にモジュールをONにする記述を記載しませんでしたが、問題なくビルドしたものも動きました。

他にもいろいろ設定できますが、上記だけで次のような感じで自動的にリリースへファイルがアップロードされます。プラットフォーム毎にビルドコマンドとか考えなくて一発で出来てしまう。。。めちゃくちゃ便利で簡単・・・!

f:id:knhko:20200520173335p:plain

参考

Go で書いた CLI ツールのリリースは GoReleaser と GitHub Actions で個人的には決まり | tellme.tokyo