golangの日記

Go言語を中心にプログラミングについてのブログ

Go言語 GitHub Actions テストとリリース

golang.png


GitHub Actions で Go のテストとリリースページでの配布を自動化したい


ディレクトリ構成

 .
 ├── .github
 │   └── workflows
 │       ├── release.yml
 │       └── test.yml
 ├── .goreleaser.yml
 ├── hello.go
 ├── hello_test.go
 ├── README.md
 ├── LICENSE
 └── cmd
     └── hello
         └── main.go





目次



テスト


GitHub Actions のドキュメント:https://docs.github.com/ja/actions

以下 push 時にブランチが main だったら依存関係をダウンロードしてテストを実行する。


.github/workflows/test.yml

name: Test

on:
  push:
    branches:
      - main

jobs:
  test:
    name: Test
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: 1.16

    - name: Get dependencies
      run: go get -v -t -d ./...

    - name: Test code
      run: go test -v .


ステータスバッジは README.md に以下のように書いておけば表示できる。

[![Test](https://github.com/ユーザー名/リポジトリ名/actions/workflows/test.yml/badge.svg)](https://github.com/ユーザー名/リポジトリ名/actions/workflows/test.yml)



リリース


goreleaserを使えばクロスコンパイルからすべてやってくれる
(actions に関する goreleaser のドキュメント: https://goreleaser.com/ci/actions/)


.github/workflows/release.yml

name: Release

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

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

      - name: Set up Go
        uses: actions/setup-go@v2
        with:
          go-version: 1.16

      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v2
        with:
          version: latest
          args: release --rm-dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


本来は workflow_run を使ってテスト後にリリースを実行したい。テストに成功して且つタグを付けてるときにだけ実行するように、以下のような感じで色々試したけどうまくいかない。なので上記のように tags: 'v[0-9]+*' とすることにした

name: Release

on:
  workflow_run:
    workflows: ["Test"]
    types:
      - completed

jobs:
  goreleaser:
    if: ${{ startsWith(github.ref, 'refs/tags/v') && github.event.workflow_run.conclusion == 'success' }}



goreleaserの設定ファイル
(.goreleaser.yml に関するドキュメント: https://goreleaser.com/customization/archive/)

.goreleaser.yml

env:
  - GO111MODULE=on
  - CGO_ENABLED=0

before:
  hooks:
    - go mod tidy

builds:
  -
    main: ./cmd/hello/

    binary: hello

    goos:
      - linux
      - windows
      - darwin
      # - freebsd

    goarch:
      - amd64
      # - 386
      # - arm
      # - arm64

    ldflags:
      - -s -w
      - -X main.Name={{.ProjectName}}
      - -X main.Version={{.Version}}

archives:
  -
    name_template: '{{.ProjectName}}_{{.Os}}_{{.Arch}}'
    replacements:
      386: i386
      amd64: x86_64

    format_overrides:
      - goos: windows
        format: zip

    files:
      - README.md
      - LICENSE

checksum:
  name_template: 'checksums.txt'

release:
  draft: true