GithubActionsで新しく追加されたファイル名を取得する
概要
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