🕎
paths-filter を使って差分があるパッケージのみワークフローのジョブを実行する
はじめに
こんにちは、株式会社 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 は以下のような流れで動作します。
-
changes
ジョブで、paths-filter を使用してファイルの変更を検出 - フィルターの結果を
outputs
として他のジョブに渡す - 各テストジョブは
if
条件で、対応するパッケージに変更があった場合のみ実行
これにより、例えばフロントエンドのコードのみを変更した場合は、バックエンドのテストは実行されません。
導入効果
paths-filter を導入することで、以下のような効果が得られました。
- CI 実行時間の大幅な短縮
- GitHub Actions の使用時間(課金対象)の削減
- PR のレビュー時間の短縮(必要なテストのみが実行されるため)
まとめ
paths-filter を使用することで、モノレポでの CI 実行を効率化することができました。
特に複数のパッケージを持つプロジェクトでは、この最適化による恩恵が大きくなります。
また、paths-filter は柔軟な設定が可能で、プロジェクトの要件に合わせて細かくカスタマイズすることができます。
最後に
AI Shiftではエンジニアの採用に力を入れています!
少しでも興味を持っていただけましたら、カジュアル面談でお話しませんか?
(オンライン・19時以降の面談も可能です!)
【面談フォームはこちら】
Discussion