go でちょっとした調査用ツールを書いたのでついでに goreleaser を使ってみたのと、コンテナでも使いたかったので Docker Image を作って Registory への Push も GitHub Actions でやってみたメモです。
goreleaser
goreleaser は .goreleaser.yml ファイル (-f, –config= で指定も可能) で設定を行います。goreleaser init
で土台となるファイルを生成してくれます。1からファイルを作ってしまうならローカルに goreleaser コマンドをインストールする必要はありません。goreleaser check
でファイルの validation を行ってはくれますが。
init で作られるファイルは次の通り。(goreleaser のバージョンは 0.131.1)
# 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 go modules.
- go mod download
# you may remove this if you don't need go generate
- go generate ./...
builds:
- env:
- CGO_ENABLED=0
archives:
- replacements:
darwin: Darwin
linux: Linux
windows: Windows
386: i386
amd64: x86_64
checksum:
name_template: 'checksums.txt'
snapshot:
name_template: "{{ .Tag }}-next"
changelog:
sort: asc
filters:
exclude:
- '^docs:'
- '^test:'
「Customization · GoReleaser」に各項目の説明があります。archives.replacements は必須ではないけれども uname
コマンドの出力に合わせる感じですかね。GitHub Actions で使う方法も ドキュメント にあります。Action は Marcketplace にあります。(source)
結果、次のような .goreleaser.yml になりました。
before:
hooks:
- go mod download
builds:
- goos: # default では linux と darwin だけだけど windows 用のバイナリも作るようにしてみる
- linux
- darwin
- windows
goarch: # default では 386 と amd64 だけど今更 32bit は不要かなと
- amd64
ldflags: # code 側で version の更新が不要で便利
- -s -w
- -X main.version={{.Version}}
- -X main.commit={{.ShortCommit}}
- -X main.date={{.Date}}
env:
- CGO_ENABLED=0
archives:
- format: binary # 複数ファイルの zip とかじゃなくて単一のバイナリファイル配布にする (展開が面倒)
replacements:
darwin: Darwin
linux: Linux
windows: Windows
386: i386
amd64: x86_64
format_overrides: # Windows だけは zip にする (exe をダウンロードさせるのは都合が悪い)
- goos: windows
format: zip
checksum:
name_template: checksums.txt
snapshot:
name_template: "{{ .Tag }}-next"
changelog:
skip: true
GitHub Actions の workflow の方は次のようになりました。ほぼ、ドキュメントのままです。違いは go-version くらいかな。これを .github/workflows ディレクトリ内の任意の .yaml (.yml) ファイルとして保存します。
name: release
on:
push:
tags:
- "*"
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Unshallow
run: git fetch --prune --unshallow
- name: Setup Go
uses: actions/setup-go@v1
with:
go-version: 1.14.2
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v1
with:
version: latest
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
今回は使いませんでしたが homebrew-tap にも対応してるんですね。
Docker Image の Push
以前にも GitHub Actions で Docker Hub へ Push するという設定を行ったことはありましたが、その時は workflow ファイルに docker コマンドを並べていました。今回再度調査していて docker/build-push-action@v1 (Markcetplace) っていう Action の存在を知ったのでこちらを使いました。
GitHub Actions のドキュメント「Publishing Docker images - GitHub Help」にはサンプルとして次のような設定が掲載されています。
name: Publish Docker image
on:
release:
types: [published]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v2
- name: Push to Docker Hub
uses: docker/build-push-action@v1
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
repository: my-docker-hub-namespace/my-docker-hub-repository
tag_with_ref: true
on
の trigger で release が published になったら、となっています。上の設定で goreleaser が publish してくれているという理解でしたが、なぜかこちらの workflow が実行されませんでした。詳しく調べたわけではないですが、どうやら goreleaser の action ではこれが使えないようです。create-a-release action (source) だったら使えるのかな。
ということで GitHub への code の push を trigger に実行するようにしました。master branch の場合は image の tag が latest になるようです。
on:
push:
branches:
- '*'
tags:
- '*'
後は repository を自分のものにして、docker のログイン情報を secrets として登録すれば終わりです。Docker Hub の場合は自分のログインパスワードとは別に token を発行してパスワードとして設定します。
以上