ハカセノオト

moon indicating dark mode
sun indicating light mode

CircleCI で path-filtering を複数設定する

September 19, 2022

モノレポで、バックエンドとフロントエンドのそれぞれのパスに変更があった時のみ、それぞれの CI/CD を動かしたい場合の設定方法。

誤った設定例

バックエンド用と、フロントエンド用で設定ファイルを分けて、複数の path-filtering を設定しようとしたけど、下記の書き方だとエラーが出る。

.circleci/
├── config.yml
├── backend.yml
└── frontend.yml
version: 2.1
setup: true
orbs:
path-filtering: circleci/path-filtering@0.1.2
node: circleci/node@5.0.2
workflows:
version: 2
all:
jobs:
- path-filtering/filter:
base-revision: main
config-path: .circleci/backend.yml
mapping: |
backend/.* needs-backend-test true
- path-filtering/filter:
base-revision: main
config-path: .circleci/frontend.yml
mapping: |
frontend/.* needs-frontend-test true

以下のエラーが出る。

{"message":"Pipeline is not in setup state."}
Exited with code exit status 1
CircleCI received exit code 1

正常な例

バックエンド用とフロントエンド用の設定ファイルを1つのファイルにまとめると動く。 (config-path に、1 つの設定ファイルしか指定できない模様)

.circleci/
├── config.yml
└── continue-config.yml
version: 2.1
setup: true
orbs:
path-filtering: circleci/path-filtering@0.1.2
node: circleci/node@5.0.2
workflows:
version: 2
all:
jobs:
- path-filtering/filter:
base-revision: main
config-path: .circleci/continue-config.yml
mapping: |
backend/.* needs-backend-test true
frontend/.* needs-frontend-test true

バックエンドとフロントエンドで別々のファイルで管理したい場合

以下の記事で説明されているように、セットアップワークフロー上で、それぞれの yml ファイルを結合してあげれば良さそう。

CircleCI で設定ファイルを分割して path-filtering も適用する方法 - Qiita

version: 2.1
setup: true
orbs:
path-filtering: circleci/path-filtering@0.0.2
jobs:
setup:
docker:
- image: cimg/go:1.18.3
steps:
- checkout
- run:
name: Install yq4
command: |
go install github.com/mikefarah/yq/v4@latest
yq --version
- run:
name: Merge config files
command: |
mkdir -p /tmp/workspace
yq eval-all '. as $item ireduce ({}; . * $item )' ./workflows/_base.yml ./workflows/packages/*.yml > /tmp/workspace/merged.yml
cat /tmp/workspace/merged.yml
- persist_to_workspace:
root: /tmp/workspace
paths:
- merged.yml
workflows:
filter:
jobs:
- setup
- path-filtering/filter:
requires:
- setup
pre-steps:
- attach_workspace:
at: /tmp/workspace
base-revision: main
config-path: /tmp/workspace/merged.yml
mapping: |
packages/foo/.* run-foo true
packages/bar/.* run-bar true

ref: https://github.com/algas/circleci-split-example/blob/19baa52ec3588c9e6be4d0911eafb6702b2e0d8e/.circleci/config.yml#L19-L24

参考


hnishi

hnishi のブログ

ソフトウェアエンジニアです。
誰かの役に立つかもしれないと思って、調べたこと、勉強したこと、躓いた箇所などを記事にしています。
問い合わせはこちらからお願いします。