Github Actions

【Github Actions】マージ元の最新のコミットSHAを取得する方法

今回はGithub Actionsのジョブの実行中の操作で参考になる記事が少なくかなり苦戦したのでそれについて備忘録として書いていこうと思います。

やりたいこと

今回のケースは以下のようにプルリクエストからmainブランチへマージした際のfeatureブランチの最新コミットSHAを取得したいケースを考えます。

github.event.commitsから取得を試みる

表題の通り、github.event.commitsから取得をしようとしたのですができなかったです。結論だけ見たい方は次へどうぞ。

github.shaではマージコミットのSHAがとれる

on:
  push:
jobs:
  demo:
    name: demo
    runs-on: ubuntu-latest
    steps:
      - name: Show github properties
        run: |
          echo ${{ github.sha }}  # 0adb0d....
          echo ${{ github.event.before }}  # 44ac957....

github.shaではマージコミットのSHAが取れており、github.event.beforeではマージ前のmainブランチのコミットSHAが取れています。ほしいのはfeatureブランチのコミットSHAなのでこの方法ではダメそうです。

github.event.commitsでコミット情報がとれる

公式ドキュメントを覗いてみるとgithub.event.commitsでマージされるコミットの情報が取れそうなので、これを確認してみます。

on:
  push:
jobs:
  demo:
    name: demo
    runs-on: ubuntu-latest
    steps:
      - name: Show github properties
        run: |
          echo ${{ toJson(github.event.commits) }}

# 出力結果
[
    {
      "author": {
        "email": "ss*********",
        "name": "username",
        "username": "username"
      },
      "committer": {
        "email": "ss*********",
        "name": "username",
        "username": "username"
      },
      "distinct": false,
      "id": "5b4a53f.....",  # featureブランチの最新コミットSHA
      "message": "demo2",
      "timestamp": "2022-04-16T18:24:35+09:00",
      "tree_id": "1a59fc...........",
      "url": "https://github.com/*****************"
    },
    {
      "author": {
        "email": "583********",
        "name": "username",
        "username": "username"
      },
      "committer": {
        "email": "noreply@github.com",
        "name": "GitHub",
        "username": "web-flow"
      },
      "distinct": true,
      "id": "a7e83c47.........",  # マージコミットSHA
      "message": "Merge pull request #25 from username/demo2\n\ndemo2",
      "timestamp": "2022-04-16T18:26:44+09:00",
      "tree_id": "1a59fcd..........",
      "url": "https://github.com/*****************"
    }
  ]

github.event.commitsでコミットの情報が配列で取得できているのが分かります。古いコミットから順に格納されていて、最後から2番目がfeatureブランチの最新コミット(ほしいコミットの情報)、最後がマージコミットになっています。

これでとれる!と思ったのですが、Github Actionsでの配列の要素へのアクセス方法が乏しくどうやってもとれなかったです。もし何かやり方知っている人いたらコメントもらえるとうれしいです。

補足ですが、ドキュメントにはgithub.event.commits[0].shaでコミットSHAがとれるという種の記載があるのですがとれなかったです。toJsonの出力結果でもshaのプロパティはないので、これはドキュメントの間違いそうです。他にもドキュメントにある通りやってもとれないものがあったので、注意したほうがよさそうです。
ちなみに github.event.commits[0].idでならコミットSHAがとれました。

じゃあどうするか

じゃあどうするかという話ですが、僕が調べたり聞いたりした中では2種類ありました。

1. featureブランチをfetchしてgit logする

下のようにマージ元のブランチをfetchしてそれをgit logすることで取得することができます。

jobs:
  demo:
    name: demo
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: |
          git fetch origin feature/demo
          git log -n 1 origin/feature/demo --pretty=format:"%H"

# 出力結果
1189ac1... # featureブランチの最新コミットSHA

ただし、当然ですがこの方法はマージ後にブランチを削除してしまうとうまく動かなくなります。

2. github.event.pull_request.head.shaから取得する

プルリクエストからマージされたfeatureブランチであれば以下のようにして最新コミットSHAを取得することができます。

on:
  pull_request:
    types:
      - closed
jobs:
  demo:
    name: demo
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true
    steps:
      - run: echo $SHA
        env:
          SHA: ${{ github.event.pull_request.head.sha }}
# 出力結果
7999fd.... # featureブランチのコミットSHA

ユースケースとしてプルリクエストからマージするのであればこの方法がよさそうです。

さいごに

Github Actionsの記事は少ないのとドキュメントが間違えていたりして苦戦しました。この記事がなにかの役に立てればうれしいです。
ここまで読んでいただきありがとうございました。

ABOUT ME
sakai
三重出身の28歳。前職はメーカーで働いていて、プログラミングスクールに通って未経験からWeb業界に転職しました。Railsをメインで使っていて、AWSも少しできます。音楽を聞くこととYoutubeを見るのが好きです。最近はへきトラ劇場にハマってます

COMMENT

メールアドレスが公開されることはありません。