🐿️

[GitHub Actions] Push時にタグ名を取得する方法

2024/05/21に公開

はじめに

GitHub Actionsにて、「タグpush時」をトリガーにしたCIで、様々な過程で「成果物のファイルなど諸々の情報にバージョン情報をタグ名と同期するように埋め込みたい・設定したい」ということがあると思います。

この記事では、GitHub Actionsで何らかの既存のActionsを使わず、プッシュした際のタグを取得・設定する方法を調査しましたので、ubuntu-latestのようなBashを使うイメージとwindows-latestイメージのようなPowerShellを使う時とで、双方の書き方をTipsとして共有します。

前提条件

例えば、次のようなymlのトリガーでタグpushした場合を想定しています。

on:
  push:
    tags:
      - "v*"

github.ref_nameでタグ名が取れる

結論ですが、github.ref_nameを使えば簡単にタグ名だけ抽出できます。
例えば、v1.0.0という名前でタグをリモートリポジトリにpushした際の例を以下に示します。

# expected: v1.0.0
echo ${{ github.ref_name }}

step, jobでの値の共有

$GITHUB_ENVまたは$GITHUB_OUTPUTを使うことで、stepないし後続のjobでの値の共有が出来ますので、それを利用することを考えます。この際の記載の仕方を説明します。

なお、格納した値の取得の仕方は公式ドキュメントを見れば分かるかと思いますので、割愛します。以下のGitHub Actions公式ドキュメントリンクを参考にしてください。

Bash (Ubuntu)

公式マニュアルの事例通り、基本的にリダイレクトの変数名は二重引用符でくくることが良いと思います
上手く値が格納されなかったりすることがありました。

echo "TAG=${{ github.ref_name }}" >> "$GITHUB_ENV"

$GITHUB_OUTPUTは以下のようになります。

echo "TAG=${{ github.ref_name }}" >> "$GITHUB_OUTPUT"

PowerShell (Windows)

windows-latestのようなWindowsイメージを利用する場合、PowerShellの記法になります。
PowerShellでは環境変数は$env:FOOのように、$env:をつけます。PowerShellに手慣れていない方はその部分を注意してください。環境変数は取得時も$env:FOOのようにします。
基本的にPowerShellは二重引用符なしで通用しますが、あればあったで問題ないので、ここでもおまじないでつけておくと良いかもしれません。

echo "TAG=${{ github.ref_name }}" >> "$env:GITHUB_ENV"

$GITHUB_OUTPUTへは$env:GITHUB_OUTPUTとします。

echo "TAG=${{ github.ref_name }}" >> "$env:GITHUB_OUTPUT"

vのプレフィクスを取り除く

例えば、タグ名はv1.0.0にしたいが、成果物のバイナリビルドでバージョン情報を埋め込む際、1.0.0など、vのプレフィクスは避けたい、なんてことがあるかと思います。
シェル芸の書き方は色々あると思いますが、ここでは${{ github.ref_name }}の値からVERSIONという名称で設定を行い、vのプレフィクスを取り除き、$GITHUB_ENVにリダイレクト格納する例を以下に示します。

Bash (Ubuntu)

echo ${{ github.ref_name }} | sed -e 's/^v//' | xargs -I {} echo "VERSION={}" >> "$GITHUB_ENV"

PowerShell (Windows)

Write-Output ("VERSION=" + ("${{ github.ref_name }}" -replace 'v', '')) >> "$env:GITHUB_ENV"

おわりに

以上、ちょっとしたTipsですが、ご参考になれば幸いです。

Discussion