Mercurial 使いが Git を使い始め、GitHub にお世話になりはじめた記録です。
もっぱら Go を使ってツールを作っています。
この記事では、CI の仕組みで自動的にリリースしていく方法として、
GitHub Actions 上で GoReleaser を使って、タグごとに GitHub Releases にバイナリをアップする設定をしていきます。
master→main
別にやらなくても、このあとの GitHub Actions の作業や成否には影響しません。
Git(GitHub)のデフォルトブランチを改名する にもありますが、デフォルトのブランチ名をmainに変更します。
上記の記事では、ローカルでブランチを切り替えてからそれを push し、GitHub 上でデフォルトブランチを変更する設定をしています。
ローカルでのブランチ切り替えを忘れることがないので、その方法が良いと思います。
いずれにしても、GitHub のデフォルトブランチは GitHub サイト上でないとできない模様。
「ひとまず GitHub 上だけの変更で良い」という場合は、GitHub サイト上で完結します。(下記の手順)
ただ、このあと GitHub Actions 絡みでファイルの変更をしますので、サイト上で完結することに拘らなくても良いです。
GitHub 上でブランチ main を作成する
↓
"main" って入れる
この時点では、まだデフォルトブランチは変わっていません。
(↓ "default" は master についている)
デフォルトブランチを変更
ブランチの一覧を表示
↓
"Change default branch" をクリック
↓
main に切り替えて、隣の "Update" ボタンを押す
↓
ブランチ一覧のページに戻り、master のところにあるゴミ箱アイコンをクリック
↓
こうなる
ローカルで switch
git pull
git switch main
これで、ブランチ変更の手順はおしまいです。
GitHub Actions
2つのファイルを作成・配置する
以下の2つのファイルを作成します。
- .github/workflows/xxx.yml
- goreleaser.yml
作成するファイルの配置場所
ファイルの内容は、下記参照。
.github/workflows/release.yml
ファイル名は別に release.yml でなくても良いようですが。
name: release
on:
push:
tags:
- "v[0-9]+.[0-9]+.[0-9]+"
jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup Go
uses: actions/setup-go@v2
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
もっぱら uses: xxx
を使って記述していますが、run: xxx
でシェル上のようにコマンドを使えます。
GoReleaser が git dirty な状態を許さないので、go get でツールをダウンロードして使った場合は GoReleaser の実行前に run: go mod tidy
をする必要があるかもしれません。
Action は git push --tags
をしたタイミングで実行するようにしています。
GoReleaser が同じタグに対して複数回リリースできないようなので。
あと、冒頭の記述を on: push: branches: - main
(改行省略)にしておくと、何故か、そもそも Action が実行されなかった。
goreleaser.yml を追加
project_name: vvin
env:
- GO111MODULE=on
before:
hooks:
- go mod tidy
builds:
- binary: vvin
flags:
- -trimpath
ldflags:
- -s -w
- -X main.Version={{.Version}}
- -X main.Revision={{.ShortCommit}}
env:
- CGO_ENABLED=0
goos:
- windows
- darwin
- linux
goarch:
- amd64
- 386
hooks:
post: upx --lzma '{{ .Path }}'
archives:
- name_template: '{{ .ProjectName }}_v{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
replacements:
darwin: darwin
linux: linux
windows: windows
386: 386
amd64: amd64
format_overrides:
- goos: windows
format: zip
release:
prerelease: auto
リリース系のツールの中でも、-trimpath
をつけられたり upx を実行できたりするのが有り難いです。
なお、git のタグが v1.2.3
の場合 {{ .Version }}
は 1.2.3
になるようです。
また、goreleaser init
をすれば、.goreleaser.yml
の雛形を作ってくれます。
上記の内容とは違いますが。
アーカイブにファイルを追加したい場合
GitHub Releases にリリースするものに色々含めたい場合は、archives:
に追記します。
archives:
- name_template: '{{ .ProjectName }}_v{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}'
replacements:
:
files:
- LICENSE*
- README*
- sample.bat
files:
のデフォルトは LICENSE*
, README*
のようです。
が、上記のように files:
を記述した場合はその設定が消えてしまうようですので、デフォルト値も含めて記述する必要があります。
push
上記の変更をコミットした後 git push
して、タグを新たに振って、こちらも git push --tags
します。
タグは v{Major}.{Minor}.{Patch}
の形式で振ります。
上で設定している release.yml の指定にもある通り、この形式のタグをプッシュしたタイミングでのみ実行されます。
結果
(ファイルが少ないですが、上記の .goreleaser.yml を Windows 向けバイナリのみに変更しています)
CircleCI と比較して
BitBucket 上で Mercurial を使っていた頃は CircleCI を使っていました。
GitHub に乗り換えたことをきっかけに、せっかくなので GitHub Actions を体験してみたかったこともあり、乗り換えてみました。
CircleCI はフリープランで使っていますが、そちらで10秒ほどだった処理が、GitHub Actions では30秒ほどかかるようになりました。
あと、これは GoReleaser の仕様にまつわる部分だと思いますが、タグを変えないと上手く Releases にアップできないようです。
機能は変わってないのでタグは変えたくない、という場合に少しストレス…