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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 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 になりました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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) ファイルとして保存します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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 」にはサンプルとして次のような設定が掲載されています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 になるようです。
1
2
3
4
5
6
on :
push :
branches :
- '*'
tags :
- '*'
後は repository を自分のものにして、docker のログイン情報を secrets として登録すれば終わりです。Docker Hub の場合は自分のログインパスワードとは別に token を発行してパスワードとして設定します。
以上