Gitのタグから最新バージョンを取得するRubyのワンライナー
やりたいこと
Gitで管理されているリポジトリにGitのタグでリリースが管理されている。そのリポジトリ内のバージョンのタグから最新のものを取得したい。
やりかた
code:bash
LATEST_TAG=$(ruby -e 'puts git tag.each_line.map{|t| begin {raw_tag: t, gver: Gem::Version::new(t.sub(/^v/, ""))}; rescue; nil end}.compact.max_by{|v| v:gver}:raw_tag') 仕組みとしては、
Gem::Versionに変換すれば大小比較できることを利用する。つまりgitのタグをGem::Versionにの配列にすれば、.maxで最大のバージョン(=最新のバージョン) を取れる。v1.0.0-rc1のような-rc1のようなものが付いていてもGem::Version::newはパースできる。また、タグはvで始まっていても始まっていなくても良い。
バージョンとしてパースできないタグはbegin/rescueでnilになって.compactされることで無視される。タグにバージョン以外が含まれてもバージョンとしてパースできるものだけが抽出される。
実際に利用している箇所は以下のDocker HubへのリリースのCI。