Go製ソフトウェアのCIやリリースをGithubActionsで行う
Go で書いた CLI ツールのリリースは GoReleaser と GitHub Actions で個人的には決まり を読んで、自分もどうやっているのか書いておこうと思ったので書く。
CIでテストを実行する
これはまあ、素朴にやる。テスト自体はMakefileに隠蔽しておくと手元でもCIと同じテストを実行できて便利。
---
name: CI
on: [push]
jobs:
run_test:
name: Go Test
runs-on: ubuntu-latest
steps:
- name: Set up Go 1.13
uses: actions/setup-go@v1
with:
go-version: 1.13
id: go
- name: Check out code into the Go module directory
uses: actions/checkout@v1
- name: Run Test
run: |
make test
タグを打ってリリースする
masterブランチに対してタグを作成すると、Actionsで自動的にリリースされるようにしている。
---
name: Release
on:
create:
tags:
- v*.*.*
branches:
- master
jobs:
release:
name: Release on GitHub
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v1
- name: Validates GO releaser config
uses: docker://goreleaser/goreleaser:latest
with:
args: check
- name: Create release on GitHub
uses: docker://goreleaser/goreleaser:latest
with:
args: release
env:
GITHUB_TOKEN: ${{secrets.GORELEASER_TOKEN}}
リリースにはGoReleaserを使っている。これはtakaishi/kelmの.goreleaser.yaml。バージョンの埋め込みなども行なっている。
# 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
# you may remove this if you don't need go generate
- go generate ./...
builds:
- env:
- CGO_ENABLED=0
ldflags:
-X github.com/takaishi/kelm/config.Version={{.Version}}
archive:
replacements:
darwin: Darwin
linux: Linux
windows: Windows
amd64: x86_64
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ .Tag }}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
brew:
github:
owner: takaishi
name: homebrew-fomulas
commit_author:
name: goreleaserbot
email: goreleaser@carlosbecker.com
description: "CLI tool to Generate and insert markdown's table of contents"
homepage: "https://github.com/takaishi/kelm"
install: |
bin.install Dir['kelm']
test: |
system "#{bin}/kelm"
このように、環境ごとのアーカイブファイルやチェックサム、チェンジログを作ってくれる。Homebrew用のfomulasも更新する機能があって便利。
コンテナイメージをビルドする
ソフトウェアによってはコンテナイメージをビルドしたいことがある。この場合も、ActionsでビルドしてDockerHubにプッシュしている。これはtakaishi/openstack-sg-controller の例。
---
name: Docker Image CI
on:
push:
tags:
- v*.*.*
env:
DOCKER_HUB_TOKEN: ${{ secrets.DOCKER_HUB_TOKEN}}
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Build the Docker image
run: |
tag=$(echo ${{ github.ref }} | sed 's/refs\/tags\///g' | tr -d '\n')
docker login -u rtakaishi -p $DOCKER_HUB_TOKEN
docker build . --file Dockerfile --tag rtakaishi/openstack-sg-controller:${tag}
docker push rtakaishi/openstack-sg-controller:${tag}
タグの作成はlinyows/git-semvを使っている
linyows/git-semv というgit pluginがあって、これを使ってタグを作っている。major/minor/patchのタグ作成以外にもpre-releaseタグの作成ができたりして便利。
課題:リリース時にChangeLogをどう作るか
今の方法だとコミットログが羅列してあるだけなので、ちょっと読みにくいかなあと思っている。また、PullRequestがある場合はそちらの情報を表示したい。CHANGELOGファイルに自動追記されると変更を追いかけやすくて嬉しいと思うが、どうやるのがいいのか悩み中である。