Go: GoReleaserの設定ファイルをGithub ActionsのPull Request時CIでテスト/検証する

Summary

  • GoReleaserの設定ファイル = .goreleaser.yml のテスト/検証もGithub ActionsのPull Request時CIで実行したい
  • GitHub Action for GoReleaser を活用して実現する

前提条件

1
2
$ go version
go version go1.13.9 darwin/amd64

CIで.goreleaser.ymlをテストしたい(with Github Actions)

Go製ツールのReleaseでGoReleaserを使っている場合、いざReleaseを実施してみたら.goreleaser.ymlに不備があってコケてしまった → ymlを修正してやむを得ずバージョンもupした、、、という切ないケースに遭遇してしまう事がありますよね(自分は以前度々ありました…)。

もしCIで.goreleaser.ymlのテスト/検証が出来れば、Release前にymlの不備を検知する事が出来ます。以前書いたdepからgo modulesへの移行に関する記事にも載せた のですが、GoReleaserにはdry-runの機能があります。具体的にはgoreleaserコマンドに --skip-publish という公開(release)をskip出来るオプションと、 --snapshot というバージョンタグのチェックを行わず現状のコードベースの成果物を出力するオプションがあり、GoReleaserのgithub actions でもこれらのオプションはそのまま利用可能です。

yamlの例

yaml内に (番号) 形式でコメントしている箇所については後述します。

.github/workflows/ci.yml ※ 拙作ツールのファイル全体像は こちら

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
name: CI

on:  # (1)
  push:
    branches:
      - master
  pull_request:

jobs:
  validate-goreleaser:
    name: Validate .goreleaser.yml
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ 'ubuntu-latest' ]
        go: [ '1.13' ]

    steps:
    - name: Set up Go ${{ matrix.go }}
      id: setup-go
      uses: actions/setup-go@v2-beta
      with:
        go-version: ${{ matrix.go }}

    - name: Check out repositories
      id: checkout
      uses: actions/checkout@v2

    - name: Set GOVERSION env
      id: set-goversion-env
      # (2)
      run: echo "::set-env name=GOVERSION::$(go version)"

    - name: Validate .goreleaser.yml with goreleaser-action
      uses: goreleaser/goreleaser-action@v1
      with:
        version: latest
        # (3)
        args: release --snapshot --skip-publish --rm-dist --debug

.goreleaser.yml ※ 拙作ツールのファイル全体像は こちら

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# This is an example goreleaser.yaml file with some sane defaults.
# Make sure to check the documentation at http://goreleaser.com
before:
  hooks:
    # you may remove this if you don't use vgo
    - go mod download

builds:
- env:
  - CGO_ENABLED=0
  - GO111MODULE=on
  main: ./cmd/lsec2/main.go
  ldflags:
    # (2)
    - -X "github.com/goldeneggg/lsec2/cmd/lsec2/cli.GoVersion={{.Env.GOVERSION}}"

# 以下略

yamlの内容について

  • (1) この例では、masterへのpush時、及びpull request(の各種イベント発生)時に実行しようとしています
  • goreleaser-actionを実行する前の事前stepとして、setup-goとcheckoutの2アクションが必要です
  • (2) 「.goreleaser.ymlから参照したい環境変数」を set-env コマンド でセットしています(このstepは任意)
    • この例では、GOVERSION というGoのバージョンを設定した環境変数を、GoReleaserでのビルド時に埋め込みたい、という意図です
  • (3) goreleaser-action の with args セクションで --snapshot--skip-publish の2つのオプションを指定します

上記内容で実際にCI時のyamlテストを実行した時のログ(拙作ツールのもの)は こちら になります。参考までに。