GitHub Actions で Go パッケージの CI 作業を一通り行う

公開:2020/09/29
更新:2020/10/12
6 min読了の目安(約5800字IDEAアイデア記事

この記事では GitHub Actions を使って Go パッケージのリポジトリに対して以下の作業を自動化する方法を紹介する。

  1. 依存パッケージに対する脆弱性検査 (push or pull request 時)
  2. lint & test (push or pull request 時)
  3. build & deploy (バージョンタグ付加時)

依存パッケージに対する脆弱性検査

依存パッケージの検査には nancy を使うのがよさげだ。公式の GitHub Action も用意されている。

GitHub Action で nancy を動かすには .github/workflows/ ディレクトリに以下の内容の YAML ファイルを設置する。

vulns.yml
name: vulns
on:
  push:
    tags:
      - v*
    branches:
      - master
  pull_request:
jobs:
  vulns:
    name: Vulnerability scanner
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-go@v2
        with:
          go-version: ^1.13
      - name: WriteGoList
        run: go list -json -m all > go.list
      - name: Nancy
        uses: sonatype-nexus-community/nancy-github-action@main

これで pull request 時, master ブランチ[1] への push 時,およびバージョンタグを打った際に脆弱性検査が走る。

Lint & Test

Go の linter には golangci-lint がオススメだ。golangci-lint は go vet をはじめ複数の lint を集約して結果を表示してくれる優れものである。こちらも公式の GitHub Action が用意されている。

GitHub Action で golangci-lint を動かすには .github/workflows/ ディレクトリに以下の内容の YAML ファイルを設置する。

lint.yml
name: lint
on:
  push:
    tags:
      - v*
    branches:
      - master
  pull_request:
jobs:
  golangci:
    strategy:
      matrix:
        go-version: [1.15.x]
        os: [ubuntu-latest]
    name: lint
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v2
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v2
        with:
          version: latest
      - name: testing
        run: go test ./...

これで pull request 時, master ブランチ[1:1] への push 時,およびバージョンタグを打った際に golangci-lint が走る。ちなみに steps 項目の

- name: testing
  run: go test ./...

Go のテストを実行している部分である。単純な go test ではなく make コマンド等を使った複雑なテストが必要ならもう少し色々と書く必要がある。

Build & Deploy

Pure Go であれば GoReleaser を使えばクロス・コンパイルと Release ページへのデプロイまで自動でやってくれる。設定は .goreleaser.yml に書く[2]。こちらも公式の GitHub Action が用意されている。

GitHub Action で GoReleaser を動かすには .github/workflows/ ディレクトリに以下の内容の YAML ファイルを設置する。

build.yml
name: build

on:
  push:
    tags:
      - v*
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:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

これでバージョンタグを打った際に GoReleaser によるクロス・コンパイルとデプロイが走る。

GitHub Action バッヂを貼る

README.md などのドキュメントに GitHub Action の状態を表示するバッヂを貼り付けることができる。バッヂは以下の書式で指定する。

[![Actions Status](https://github.com/{user}/{repo}/workflows/{action}/badge.svg)](https://github.com/{user}/{repo}/actions)

たとえば リポジトリ https://github.com/spiegel-im-spiegel/koyomi であれば

[![lint status](https://github.com/spiegel-im-spiegel/koyomi/workflows/lint/badge.svg)](https://github.com/spiegel-im-spiegel/koyomi/actions)

とすれば

lint status

のように表示される。ちなみに {action} の名前は YAML のファイル名ではなく先頭行の name 項目に対応している。

参考ページ

脚注
  1. 2020年10月から GitHub の新規リポジトリの既定ブランチ名が main になるらしい。ご注意を。 ↩︎ ↩︎

  2. GoReleaser の使い方等は割愛する。たぶんググったら日本語でも情報が出てくると思う。 ↩︎