GitHub Actions で Go パッケージの CI 作業を一通り行う
この記事では GitHub Actions を使って Go パッケージのリポジトリに対して以下の作業を自動化する方法を紹介する。
- 依存パッケージに対する脆弱性検査 (push or pull request 時)
- lint & test (push or pull request 時)
- build & deploy (バージョンタグ付加時)
依存パッケージに対する脆弱性検査
依存パッケージの検査には nancy を使うのがよさげだ。公式の GitHub Action も用意されている。
- sonatype-nexus-community/nancy: A tool to check for vulnerabilities in your Golang dependencies, powered by Sonatype OSS Index
- sonatype-nexus-community/nancy-github-action: Sonatype Nancy for GitHub Actions
GitHub Action で nancy を動かすには .github/workflows/
ディレクトリに以下の内容の YAML ファイルを設置する。
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 が用意されている。
- golangci/golangci-lint: Fast linters Runner for Go
- golangci/golangci-lint-action: Official GitHub action for golangci-lint from it's authors
GitHub Action で golangci-lint を動かすには .github/workflows/
ディレクトリに以下の内容の YAML ファイルを設置する。
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 が用意されている。
- goreleaser/goreleaser: Deliver Go binaries as fast and easily as possible
- goreleaser/goreleaser-action: GitHub Action for GoReleaser
GitHub Action で GoReleaser を動かすには .github/workflows/
ディレクトリに以下の内容の YAML ファイルを設置する。
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 の状態を表示するバッヂを貼り付けることができる。バッヂは以下の書式で指定する。
[](https://github.com/{user}/{repo}/actions)
たとえば リポジトリ https://github.com/spiegel-im-spiegel/koyomi
であれば
[](https://github.com/spiegel-im-spiegel/koyomi/actions)
とすれば
のように表示される。ちなみに {action}
の名前は YAML のファイル名ではなく先頭行の name
項目に対応している。
参考ページ
-
golangci-lint を GitHub Actions で使う — プログラミング言語 Go | text.Baldanders.info
-
GitHub Actions でクロス・コンパイル(GoReleaser 編) — プログラミング言語 Go | text.Baldanders.info
-
Go のコードでも GitHub Code Scanning が使えるらしい — しっぽのさきっちょ | text.Baldanders.info
-
2020年10月から GitHub の新規リポジトリの既定ブランチ名が
main
になるらしい。ご注意を。 ↩︎ ↩︎ -
GoReleaser の使い方等は割愛する。たぶんググったら日本語でも情報が出てくると思う。 ↩︎