はじめに
こんにちは、Gakken LEAP のバックエンドエンジニアの mizuno です。
GitHub Actionsを使用して、mainブランチにマージされたときに新しく追加されたMarkdownファイルをSlackに通知する仕組みを作成しようとしました。しかし、期待通りに通知が送られないことがありました。
具体的には、新規に追加されたファイルが、変更検知の対象にならないケースがありました。
そこで、ファイルの追加を確実に検知できるように、GitHub Actionsのpaths-filter
アクションを活用して修正しました。
修正前の実装
修正前は、以下のようにgit diff
を使用してファイルの変更を検知していました。
name: test
on:
push:
branches:
- main
jobs:
echo_diff_files:
name: test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Markdown files
run: |
files=(`git diff --name-only HEAD^ HEAD | grep '\.md$' |tr '\n' ' ' `)
for file in ${files[@]}; do
echo $file
done
コマンドの動作概要
-
git diff --name-only HEAD^ HEAD
- 最新のコミット(
HEAD
)とその一つ前のコミット(HEAD^
)の間で変更されたファイルの名前をリストアップします。
- 最新のコミット(
-
| grep '\.md$'
- 上記の変更ファイルリストから、Markdownファイル(拡張子
.md
)のみを抽出します。
- 上記の変更ファイルリストから、Markdownファイル(拡張子
-
| tr '\n' ' '
- 改行文字をスペースに置き換え、1行の文字列としてファイル名を並べます。
-
files=(...)
- コマンドの出力を取得し、配列
files
に格納します。
- コマンドの出力を取得し、配列
このコマンドで、直前のコミットが新規追加の場合には正常に動作しますが、
プルリクエストで運用している際に、新規作成されたファイルが複数回変更された場合、検知が正しく行われない問題がありました。
paths-filterを使った修正
この問題を解決するために、paths-filter アクションを使用して、main
ブランチへのプッシュ時にMarkdownファイルの追加を確実に検知するように変更しました。
修正後の実装
name: test
on:
push:
branches:
- main
jobs:
echo_diff_files:
name: test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: filter paths
uses: dorny/paths-filter@v3
id: filter
with:
filters: |
markdown:
added: '*.md'
list-files: shell
- name: Markdown files
if: ${{ steps.filter.outputs.markdown == 'true' }}
run: |
for file in ${{ steps.filter.outputs.markdown_files }}; do
echo $file
done
paths-filterの動作概要
-
dorny/paths-filter@v3
- このアクションを使用して、指定したパターン(今回は
*.md
)に一致するファイルが追加されたかどうかを検知します。
- このアクションを使用して、指定したパターン(今回は
-
filters
オプション-
added: '*.md'
と指定することで、新しく追加されたMarkdownファイルに絞ってフィルタリングします。
-
-
steps.filter.outputs.markdown_files
- フィルタに一致したファイルリストを取得し、後続のステップで処理します。
まとめ
git diff
を使った変更検知ではプルリクエスト経由の運用においてうまく動作しないケースがあったため、
paths-filter
アクションを使用することで、ファイルの追加を確実に検知できるように修正しました。
これにより、新規追加されたMarkdownファイルを後続の処理でSlackに通知にすることが可能になりました。
エンジニア募集
Gakken LEAP では教育をアップデートしていきたいエンジニアを募集しています。
ぜひカジュアル面談でお話できればと思います。
https://gakken-leap.co.jp/recruit/