今回は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の記事は少ないのとドキュメントが間違えていたりして苦戦しました。この記事がなにかの役に立てればうれしいです。
ここまで読んでいただきありがとうございました。