🗒

GithubActionsで新しく追加されたファイル名を取得する

2021/04/30に公開

概要

Github Actions で新しく追加されたマークダウンファイルの一覧を取得したいことがあったのでその忘備録です

使用する git コマンドの解説

先に簡単に使用する git コマンドの解説をします。知っている方は飛ばしてください。

git diff XX..YYY --name-only --diff-filter=A -- '*.md'

git diff XX..YY : XX と YY の差分を取得します。XX、YY はブランチ名でも SHA でも使えます。
--name-only: 何も設定しないと色々な情報が表示されますが、このオプションをつけることで変更のあったファイルのパスだけを表示します。
--diff-filter=A: 変更の種別を指定できます。この場合はAddのみです。
-- '*.md': これは git コマンドではなくて globstar ですが、.md拡張子のファイルのみにマッチするようにワイルドカードを指定しています。

PR 作成/変更時の取得

こちらはストレートに PR イベント時に利用できるデフォルトの環境変数を使います。
例えばpatchブランチをmainにマージする PR の場合、${GITHUB_BASE_REF}にはmain${GITHUB_HEAD_REF}にはpatchが入ります。

run: |
    for file in $(git diff origin/${GITHUB_BASE_REF}..origin/${GITHUB_HEAD_REF} --name-only --diff-filter=A -- '*.md') ; do
    # したい処理をする
    done

PR マージ時の取得

はじめに試したのは上記の job のタイミングをclosedに変更し、if条件をつけて実行タイミングをマージした時のみとすることでした。

on:
  pull_request:
    branches: [main]
    types:[closed]
jobs:
  setup-deploy:
    runs-on: ubuntu-latest
    if: github.event.pull_request.merged == true

が、この条件を満たす時の実行では${GITHUB_BASE_REF}${GITHUB_HEAD_REF}が取得できません。そのため、素直にpushイベントを採用し、github の context から SHA を取得することにしました。

on:
  push:
    branches: [main]
jobs:
  post-merge:
    runs-on: ubuntu-latest
    steps:
      - id: get_diff
        run: |
            for file in $(git diff ${{github.event.before}}..${{github.event.after}} --name-only --diff-filter=A -- '*.md') ; do
            # したい処理をする
            done

この場合、github.event.beforeにはマージ前のmainブランチの最新コミットの SHA、github.event.afterにはマージコミットの SHA が入ります。

小ネタ(Github context)

こちらの stackoverflow の回答で紹介されているのですが、以下のように指定することでどんな github context が利用できるか確認できます。

- name: Dump GitHub context
env:
    GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"

Discussion