3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Actionsを活用したMarkdownファイルの追加検知

Last updated at Posted at 2024-10-16

はじめに

こんにちは、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

コマンドの動作概要

  1. git diff --name-only HEAD^ HEAD
    • 最新のコミット(HEAD)とその一つ前のコミット(HEAD^)の間で変更されたファイルの名前をリストアップします。
  2. | grep '\.md$'
    • 上記の変更ファイルリストから、Markdownファイル(拡張子.md)のみを抽出します。
  3. | tr '\n' ' '
    • 改行文字をスペースに置き換え、1行の文字列としてファイル名を並べます。
  4. 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の動作概要

  1. dorny/paths-filter@v3
    • このアクションを使用して、指定したパターン(今回は*.md)に一致するファイルが追加されたかどうかを検知します。
  2. filtersオプション
    • added: '*.md'と指定することで、新しく追加されたMarkdownファイルに絞ってフィルタリングします。
  3. steps.filter.outputs.markdown_files
    • フィルタに一致したファイルリストを取得し、後続のステップで処理します。

まとめ

git diffを使った変更検知ではプルリクエスト経由の運用においてうまく動作しないケースがあったため、
paths-filterアクションを使用することで、ファイルの追加を確実に検知できるように修正しました。
これにより、新規追加されたMarkdownファイルを後続の処理でSlackに通知にすることが可能になりました。

エンジニア募集

Gakken LEAP では教育をアップデートしていきたいエンジニアを募集しています。
ぜひカジュアル面談でお話できればと思います。
https://gakken-leap.co.jp/recruit/

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?