パスフィルタリングと選択的ビルド
モノレポやマルチリポジトリ構成で、パスフィルター、変更検出、条件付きマトリックスを使い、変更の影響を受けるワークフローとジョブだけを起動します。
「パスフィルタリングと選択的ビルド」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
無駄なビルドの問題
モノレポでは、ドキュメントの変更によってバックエンド、フロントエンド、モバイルアプリまで再ビルドして再デプロイする必要はありません。
選択的ビルドでは、変更の影響を受ける部分だけをパイプラインで実行するため、時間とRunnerの実行時間を節約できます。
トリガーでのパスフィルター
最も簡単な方法は、トリガーにpathsフィルターを設定することです。パターンに一致するファイルが変更されたときだけ、ワークフローが実行されます。
on:
push:
paths:
- 'services/api/**'パスの除外
paths-ignoreを使えば、逆の指定もできます。指定したパス以外に変更があった場合にワークフローを実行します。
ドキュメントだけの変更でCIをスキップしたい場合に便利です。
on:
push:
paths-ignore:
- 'docs/**'
- '**.md'トリガーフィルターの限界
トリガーレベルのフィルターは、ワークフロー全体を実行するかどうかを決めます。しかしモノレポでは、1つのワークフロー内で、どのジョブを実行するかを決めたいことがよくあります。
その場合は、ワークフロー内で変更を検出し、その結果に応じて処理を分岐します。
変更検出アクション
dorny/paths-filterアクションは差分を調べ、名前付きの各パスグループについて真偽値を出力します。
後続のジョブは、その出力を読み取って実行するかどうかを決定します。
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
api:
- 'services/api/**'
web:
- 'services/web/**'検出した変更によるジョブの制御
検出ジョブは出力を公開し、後続のジョブはneedsコンテキストとifを使って条件付きで実行します。
build-api:
needs: detect
if: needs.detect.outputs.api == 'true'
runs-on: ubuntu-latest
steps:
- run: ./build-api.sh出力の接続
検出ジョブでは、フィルター結果を他のジョブから読み取れるように転送するoutputsを宣言する必要があります。
detect:
runs-on: ubuntu-latest
outputs:
api: ${{ steps.changes.outputs.api }}
web: ${{ steps.changes.outputs.web }}動的マトリックス
多くのサービスがある場合は、変更されたパスからマトリックスを動的に作成できます。これにより、変更されたサービスだけがマトリックスに含まれます。
1つのジョブでJSONリストを生成し、次のジョブのマトリックスに渡します。
strategy:
matrix:
service: ${{ fromJSON(needs.detect.outputs.list) }}検出に使うGit Diff
生のgitを使って変更を検出することもできます。現在のコミットとベースを比較して、変更されたディレクトリを一覧表示します。
git diff --name-only origin/main...HEAD | cut -d/ -f1-2 | sort -u必須チェックとスキップ
注意が必要です。何も変更されていないために必須ステータスチェックがスキップされると、ブランチ保護によって、そのチェックの完了を待ったままマージがブロックされることがあります。
この問題は、常に成功し、条件付きジョブの結果をまとめるゲートジョブを最後に追加し、それだけを必須チェックにすることで解決できます。
gate:
needs: [build-api, build-web]
if: always()
runs-on: ubuntu-latest
steps:
- run: echo 'all required jobs resolved'パッケージごとのキャッシュ
選択的ビルドはパッケージごとのキャッシュと相性が良い方法です。各サービスのlockfileをキーにしてキャッシュを管理すれば、関係のない変更でキャッシュが無効になりません。
この2つを組み合わせることで、リポジトリが大きくなってもモノレポのパイプラインを高速に保てます。
理解度チェック
選択的ビルドの理解度を確認しましょう。
まとめ
変更された部分だけをビルドする方法を学びました。
pathsとpaths-ignoreでワークフロー全体の実行を制御します- 変更検出アクションは、パスごとの真偽値を出力します
- ジョブは
ifとneedsを使って条件付きで実行でき、マトリックスも動的に作成できます - 必須チェックに対応するため、
always()を使ったゲートジョブを追加します
選択的ビルドによって、モノレポのCI/CDを高速かつ効率的に運用できます。
よくある質問
「パスフィルタリングと選択的ビルド」レッスンは無料ですか?
はい。「パスフィルタリングと選択的ビルド」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「パスフィルタリングと選択的ビルド」で何を学びますか?
モノレポやマルチリポジトリ構成で、パスフィルター、変更検出、条件付きマトリックスを使い、変更の影響を受けるワークフローとジョブだけを起動します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「パスフィルタリングと選択的ビルド」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- モノレポの CI/CD
- リポジトリ間ワークフロー
- ワークフローの一元管理
- パスフィルタリングと選択的ビルド