【GitHub Actions 小ネタ】プルリクエスト時に差分ファイルの一覧を取得する

2022.11.10

GitHub Actionsを使って、 プルリクエスト作成時(もしくは commit push時)に ベースブランチからの差分ファイルを取得したいです。

例えば base:main ← compare:fix のプルリクエストを作成したとします。 このとき mainブランチとfixブランチの差分ファイル一覧を取得、 差分ファイルに対して Lintを行う、といったことを実現したいです。

以下にそれを実現するワークフローのテンプレート、および活用例を書いてみました。

テンプレート

name: run-actions-using-diff-files

on:
  pull_request:
    types: [opened, synchronize, reopened]
    branches: [ main ]
    paths: [ 'docs/**.md' ]

env:
  base_branch: main
  diff_path: 'docs/**.md'

jobs:
  run-actions:
    runs-on: ubuntu-latest
    steps:
      - name: Switch to pull request branch
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Fetch base branch
        run: git fetch origin ${base_branch}:${base_branch}

      - name: Run actions using diff_files
        run: |
          diff_files=$(git diff --name-only HEAD ${base_branch} -- "${diff_path}" \
            | tr "\n" " ")
          echo "# diff_files: ${diff_files}"
          ####
          # ここから先に ${diff_files} を使った処理を記載

on: にて自動トリガーの設定を pull_request イベントに絞っています。 branches, paths を書いてブランチ・ファイルパスでフィルターしています。 このフィルターは用途に合わせて変えてください。

env: にて環境変数を定義します。 baseブランチ( base_branch )、および git diff の範囲 ( diff_path )を用途に合わせて指定します。

jobs: にて「差分ファイル一覧を取得する」ところまでを記載しています。

  • Switch to pull request branch - actions/checkout を使ってcompareブランチに切り替えています
  • Fetch base branch - baseブランチをローカルにコピーしています
  • Run actions using diff_files - git diff コマンドを使って差分ファイル一覧を取得します。 取得した一覧( ${diff_files} )を使って "何かの処理" を実現します。

活用例(MarkdownファイルのLint)

以下ワークフローは Markdownファイルを textlint を使って 校正する一例です。 docs ディレクトリ配下のmdファイルに対してチェックを行います。 ※今回はシンプルに 「ら抜き言葉」チェック のみ。

name: run-actions-using-diff-files

on:
  pull_request:
    types: [opened, synchronize, reopened]
    branches: [ main ]
    paths: [ 'docs/**.md' ]

env:
  base_branch: main
  diff_path: 'docs/**.md'

jobs:
  run-actions:
    runs-on: ubuntu-latest
    steps:
      - name: Switch to pull request branch
        uses: actions/checkout@v3
        with:
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: 14

      - name: Install textlint
        run: npm install textlint textlint-rule-no-dropping-the-ra

      - name: Fetch base branch
        run: git fetch origin ${base_branch}:${base_branch}

      - name: Run actions using diff_files
        run: |
          diff_files=$(git diff --name-only HEAD ${base_branch} -- "${diff_path}" \
            | tr "\n" " ")
          echo "# diff_files: ${diff_files}"
          ####
          # ここから先に ${diff_files} を使った処理を記載
          npx textlint ${diff_files} --rule textlint-rule-no-dropping-the-ra

実際にプルリクエストを作成して、GitHub Actions を走らせてみます。 以下キャプチャの Run actions using diff_files ステップから、 差分ファイルの一覧が取得できていることが分かります。

img

※ちなみに、 textlint (Markdown自動校正) 周りの話は以下ブログに細かく書いています。

おわりに

「プルリクエスト時に差分ファイルの一覧を取得する」GitHub Actionsワークフローを作ってみました。

更新予定のファイルに対してプルリクエスト上で何かチェックをしたいときに役立つと思います。

参考