Closed4

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

muleyuckmuleyuck
  • <CLI名> --versionで出力する値はソースコードに定数として直接実装している
  • タグのpushでgoreleaserが発火しReleasesを作成する

この時にソースコードのバージョン定数をちゃんと変更しておかないと、
タグ値と乖離してしまうのでなんとかして揃えるのが目標

muleyuckmuleyuck

GitHub Actionsでタグpush時にチェックする

if [[ "<pushされたタグ名>" != $(<CLI名> --version) ]]; then
  exit 1
fi

これだと、

  • exit 1になった時にtagが無駄に発行されてしまう
  • バージョンの管理がソースコードとタグの2重管理になる

のでもう少しどうにかする

muleyuckmuleyuck

ファイルにバージョンを書き出すようにする

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更新が失敗する可能性あり
    • 実行順序は逆が望ましい
  • マージするのが面倒
muleyuckmuleyuck

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があるかチェックしているようでそれを避けるため

今回必要だったのはこちらのリポジトリ
https://github.com/muleyuck/linippet

このスクラップは4ヶ月前にクローズされました