GitHub Actions でブランチ名を取得する


概要

GitHub Actions でいろいろなタイミングでトピックブランチ名を取得したかったので調べてみました。

挙動

トピックブランチに Push 時にトピックブランチ名を取得

次のコマンドで取得可能です。

on:
  push:

jobs:
  sample:
    runs-on: ubuntu-latest
    steps:
      - run: echo "${GITHUB_REF#refs/heads/}"
      - run: echo "${GITHUB_REF_CONTEXT#refs/heads/}"
    env:
      GITHUB_REF_CONTEXT: ${{ github.ref }}

PRが作成されている場合にトピックブランチ名を取得

次のコマンドで取得可能です。

on:
  push:

jobs:
  sample:
    runs-on: ubuntu-latest
    if: github.event.pull_request
    steps:
      - run: echo "${GITHUB_REF#refs/heads/}" # PRの番号が取得されてしまいます
      - run: echo "${GITHUB_HEAD_REF}"
      - run: echo "${{ github.ref }}"

PRをマージ時にトピックブランチ名を取得

できないです。

ちなみにPRをマージ時に発火させる場合には、

on:
  pull_request:

jobs:
  sample:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
      - run: #command

で可能です。

tips

github のコンテキストや環境変数を実際に確認したい

次のコマンドで取得可能です。

- run: echo '${{ toJson(github) }}'
- run: env

まとめ

以下の関係になっていることがわかりました。

GITHUB_REF GITHUB_HEAD_REF GITHUB_BASE_REF
push refs/heads/${branch_name} "(empty)" "(empty)"
PR refs/pull/${PR_number}/merge ${branch_name} main

context の一部は環境変数として事前に定義されていて環境変数として渡せることもわかりました。その場合は大文字で ._ になった値が設定されています。
また、context は文字列加工ができないので、いったん env を利用してjob 内の環境変数として定義した上で利用すると取り回しがしやすいです。

普段はプライベートでしかGHAを触ることはありませんが、yml を定義するだけでCIを回せるようになってとても楽な時代になりました。

参考

GitHub Actions のコンテキストおよび式の構文
環境変数
Github Actionsの個人的ユースケース備忘録