🕎

paths-filter を使って差分があるパッケージのみワークフローのジョブを実行する

2024/12/03に公開

はじめに

こんにちは、株式会社 AI Shift の yoshi です。
本記事は AI Shift Advent Calendar 2024 の 3 日目の記事となります。

今回は GitHub Actions で dorny/paths-filter を使用して、モノレポ内の変更があったパッケージに対してのみワークフローのジョブを実行する方法について共有します。

対象読者

  • モノレポ構成のプロジェクトで GitHub Actions を利用している開発者
  • ワークフローの実行時間を最適化したい開発者

説明しないこと

  • GitHub Actions の基本的な使い方
  • モノレポの基本概念

paths-filter の導入

モノレポでは、複数のパッケージやアプリケーションを 1 つのリポジトリで管理します。
しかし、すべてのパッケージに対してテストやビルドを実行すると、CI の実行時間が長くなってしまいます。
そこで、dorny/paths-filter を使用して変更があったパッケージのみを検出し、必要なワークフローのみを実行するようにします。

以下は、paths-filter を使用した設定例です。

.github/workflows/ci.yml
name: CI

on:
  pull_request:
    branches: [ main ]

jobs:
  changes:
    runs-on: ubuntu-latest
    outputs:
      frontend: ${{ steps.filter.outputs.frontend }}
      backend: ${{ steps.filter.outputs.backend }}
      force: ${{ steps.filter.outputs.force }}
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@v2
        id: filter
        with:
          filters: |
            frontend:
              - 'packages/frontend/**'
            backend:
              - 'packages/backend/**'
            force:
              - '.github/workflows/ci.yaml'

  frontend-test:
    needs: changes
    if: ${{ needs.changes.outputs.frontend == 'true' || needs.changes.outputs.force == 'true' }}
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: packages/frontend
    steps:
      - uses: actions/checkout@v4
      - name: Install dependencies
        run: npm ci
      - name: Frontend Tests
        run: npm test

  backend-test:
    needs: changes
    if: ${{ needs.changes.outputs.backend == 'true' || needs.changes.outputs.force == 'true' }}
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: packages/backend
    steps:
      - uses: actions/checkout@v4
      - name: Install dependencies
        run: npm ci
      - name: Backend Tests
        run: npm test

仕組みの解説

paths-filter は以下のような流れで動作します。

  1. changesジョブで、paths-filter を使用してファイルの変更を検出
  2. フィルターの結果をoutputsとして他のジョブに渡す
  3. 各テストジョブはif条件で、対応するパッケージに変更があった場合のみ実行

これにより、例えばフロントエンドのコードのみを変更した場合は、バックエンドのテストは実行されません。

導入効果

paths-filter を導入することで、以下のような効果が得られました。

  • CI 実行時間の大幅な短縮
  • GitHub Actions の使用時間(課金対象)の削減
  • PR のレビュー時間の短縮(必要なテストのみが実行されるため)

まとめ

paths-filter を使用することで、モノレポでの CI 実行を効率化することができました。
特に複数のパッケージを持つプロジェクトでは、この最適化による恩恵が大きくなります。
また、paths-filter は柔軟な設定が可能で、プロジェクトの要件に合わせて細かくカスタマイズすることができます。

最後に

AI Shiftではエンジニアの採用に力を入れています!
少しでも興味を持っていただけましたら、カジュアル面談でお話しませんか?
(オンライン・19時以降の面談も可能です!)
【面談フォームはこちら】
https://hrmos.co/pages/cyberagent-group/jobs/1826557091831955459

AI Shift Tech Blog

Discussion