Closed4
自作のGo製CLIで--versionの出力値をtag名にしたい

-
<CLI名> --version
で出力する値はソースコードに定数として直接実装している - タグのpushでgoreleaserが発火しReleasesを作成する
この時にソースコードのバージョン定数をちゃんと変更しておかないと、
タグ値と乖離してしまうのでなんとかして揃えるのが目標

GitHub Actionsでタグpush時にチェックする
if [[ "<pushされたタグ名>" != $(<CLI名> --version) ]]; then
exit 1
fi
これだと、
- exit 1になった時にtagが無駄に発行されてしまう
- バージョンの管理がソースコードとタグの2重管理になる
のでもう少しどうにかする

ファイルにバージョンを書き出すようにする
app_version
v1.2.3
でReleaseが完了したあとに発火するworkflowにて
latest_tag=$(git describe --tags --abbrev=0)
sed -i -e "s/.*/$latest_tag/" ./app_version
これで最新のtag値がversionファイルに更新されるので
ブランチ作成/コミット/PullRequest作成 して手動でマージする
※ 自動でmainブランチにマージはされたくない
Good:
- ほぼ自動でversionは揃う
More:
- releaseは成功しているのにversion更新が失敗する可能性あり
- 実行順序は逆が望ましい
- マージするのが面倒

releaseされたモジュールに対して--versionにtag値が使われていれば良い、という感じにする
- ただし開発中に現在の最新のバージョンが何かはわからない
- これはバージョンの値を何かに使うわけではないので許容できる
app_version
unknown
という風にしておいて、releaseするworkflowで
pushed_tag=${GITHUB_REF#refs/tags/}
if [[ ! $pushed_tag =~ v[0-9]+.[0-9]+.[0-9] ]]; then
echo Invalid version. You must enter version like v1.2.34 for example
exit 1
fi
sed -i -e "s/.*/$pushed_tag/" ./app_version
# ignore version change for avoiding `Git is in a dirty state` in goreleaser
git update-index --skip-worktree ./app_version
とした。一応タグ値がversionっぽいフォーマットになっているかは確認するようにした
skip-worktreeでapp_versionの変更を無視しているのは、
goreleaserがdiffがあるかチェックしているようでそれを避けるため
今回必要だったのはこちらのリポジトリ
このスクラップは4ヶ月前にクローズされました