CircleCI で path-filtering を複数設定する
September 19, 2022
モノレポで、バックエンドとフロントエンドのそれぞれのパスに変更があった時のみ、それぞれの CI/CD を動かしたい場合の設定方法。
誤った設定例
バックエンド用と、フロントエンド用で設定ファイルを分けて、複数の path-filtering を設定しようとしたけど、下記の書き方だとエラーが出る。
.circleci/├── config.yml├── backend.yml└── frontend.yml
version: 2.1setup: trueorbs:path-filtering: circleci/path-filtering@0.1.2node: circleci/node@5.0.2workflows:version: 2all:jobs:- path-filtering/filter:base-revision: mainconfig-path: .circleci/backend.ymlmapping: |backend/.* needs-backend-test true- path-filtering/filter:base-revision: mainconfig-path: .circleci/frontend.ymlmapping: |frontend/.* needs-frontend-test true
以下のエラーが出る。
{"message":"Pipeline is not in setup state."}Exited with code exit status 1CircleCI received exit code 1
正常な例
バックエンド用とフロントエンド用の設定ファイルを1つのファイルにまとめると動く。
(config-path
に、1 つの設定ファイルしか指定できない模様)
.circleci/├── config.yml└── continue-config.yml
version: 2.1setup: trueorbs:path-filtering: circleci/path-filtering@0.1.2node: circleci/node@5.0.2workflows:version: 2all:jobs:- path-filtering/filter:base-revision: mainconfig-path: .circleci/continue-config.ymlmapping: |backend/.* needs-backend-test truefrontend/.* needs-frontend-test true
バックエンドとフロントエンドで別々のファイルで管理したい場合
以下の記事で説明されているように、セットアップワークフロー上で、それぞれの yml ファイルを結合してあげれば良さそう。
CircleCI で設定ファイルを分割して path-filtering も適用する方法 - Qiita
version: 2.1setup: trueorbs:path-filtering: circleci/path-filtering@0.0.2jobs:setup:docker:- image: cimg/go:1.18.3steps:- checkout- run:name: Install yq4command: |go install github.com/mikefarah/yq/v4@latestyq --version- run:name: Merge config filescommand: |mkdir -p /tmp/workspaceyq eval-all '. as $item ireduce ({}; . * $item )' ./workflows/_base.yml ./workflows/packages/*.yml > /tmp/workspace/merged.ymlcat /tmp/workspace/merged.yml- persist_to_workspace:root: /tmp/workspacepaths:- merged.ymlworkflows:filter:jobs:- setup- path-filtering/filter:requires:- setuppre-steps:- attach_workspace:at: /tmp/workspacebase-revision: mainconfig-path: /tmp/workspace/merged.ymlmapping: |packages/foo/.* run-foo truepackages/bar/.* run-bar true