CircleCI Cloudのpath-filteringを試してみる
これにあるpath-filteringを試す
セットアップ・ワークフロー(モノレポ対応) プレビューに参加しよう!(setup workflow) - Community - CircleCI Discuss
これを参考に作る。setup-workflowを利用するようだ。
api-preview-docs/path-filtering.md at path-filtering · CircleCI-Public/api-preview-docs
これを参考に作る。setup-workflowを利用するようだ。
api-preview-docs/path-filtering.md at path-filtering · CircleCI-Public/api-preview-docs
必要なのは二つのyamlファイル。
.circleci/config.yml
とpath-filtering
で実行される任意のyamlファイル(ここでは.circleci/go.yml
にする)。
まずは通常実行される.circleci/config.yml
を作る。
version: 2.1
setup: true
orbs:
path-filtering: circleci/path-filtering@0.0.2
workflows:
setup-workflow:
jobs:
- path-filtering/filter:
config-path: .circleci/go.yml
mapping: |
go/helloworld/.* go-helloworld true
ref: https://github.com/korosuke613/playground/blob/main/.circleci/config.yml
-
setup: true
でsetup workflowを有効にする -
orbs
にpath-filtering: circleci/path-filtering@0.0.2
を指定し、path-filetering
を使えるようにする。 -
setup-workflow
ワークフロー[1]を作る-
config-path
に後続のyamlファイルを指定する -
mapping
で監視したいファイルとtrue
にしたいパラメータを設定する。この場合はgo/helloworld
以下の任意のファイルが変更されていたらgo-hello-world
パラメータをtrue
にすることになる
-
-
名前はなんでもいい??わからん ↩︎
次はconfig-path
に指定したyamlファイルを作る。
# Use the latest 2.1 version of CircleCI pipeline process engine. See: https://circleci.com/docs/2.0/configuration-reference
version: 2.1
parameters:
go-helloworld:
type: boolean
default: false
orbs:
go: circleci/go@1.6.0
commands:
go-setup:
...
jobs:
go-helloworld-build:
...
go-helloworld-test:
...
go-helloworld-lint:
...
workflows:
version: 2
go-helloworld:
when: << pipeline.parameters.go-helloworld >>
jobs:
- go-helloworld-build
- go-helloworld-test
- go-helloworld-lint
ref: https://github.com/korosuke613/playground/blob/main/.circleci/go.yml
- 先ほど
mapping
で指定したgo-helloworld
パラメータをparameters
に作る。boolean
でデフォルト値false
にする。 - 操作したいワークフローに
when: << pipeline.parameters.go-helloworld >>
を設定する。これでgo-helloworld
パラメータがtrue
の時だけ実行されることになる
二つのワークフローのコミットをbuildすると以下のようになった。
ref: https://app.circleci.com/pipelines/github/korosuke613/playground?branch=main
ref: https://app.circleci.com/pipelines/github/korosuke613/playground/6/workflows/801e7082-2a7e-4e28-a1c7-0ec899d2a586/jobs/12
setup-workflow
は成功してる。が、後続のジョブが失敗してる。
多分go/helloworld/.*
以下に変更がなかったからgo.yml
で実行するワークフローが存在しなくて怒られてる。
うーん常に実行される空のワークフローを用意しないといけない??
簡単なgo/helloworld
以下にコードを追加してpush
おお、できた
ログには以下のようなものが出てた。
{
"continuation-key": "************************************************************************************************************************************************************************************************************************************************************************************************************************",
"configuration": "# Use the latest 2.1 version of CircleCI pipeline process engine. See: https://circleci.com/docs/2.0/configuration-reference\nversion: 2.1\n\nparameters:\n go-helloworld:\n type: boolean\n default: false\n\norbs:\n go: circleci/go@1.6.0\n\ncommands:\n go-setup:\n description: \"goのセットアップ\"\n steps:\n - go/load-cache\n - go/mod-download\n - go/save-cache\n\njobs:\n go-helloworld-build:\n working_directory: ~/repo/go/helloworld\n executor:\n name: go/default\n tag: '1.16.3'\n steps:\n - checkout:\n path: ~/repo\n - go-setup\n - run:\n name: Build\n command: |\n go build\n - run:\n name: Exec\n command: |\n ./helloworld\n\n go-helloworld-test:\n working_directory: ~/repo/go/helloworld\n executor:\n name: go/default\n tag: '1.16.3'\n steps:\n - checkout:\n path: ~/repo\n - go-setup\n - run:\n name: Run tests\n command: |\n mkdir -p /tmp/test-reports\n gotestsum --junitfile /tmp/test-reports/unit-tests.xml\n - store_test_results:\n path: /tmp/test-reports\n\n go-helloworld-lint:\n working_directory: ~/repo/go/helloworld\n docker:\n - image: golangci/golangci-lint:v1.39.0\n steps:\n - checkout:\n path: ~/repo\n - run:\n name: Lint\n command: |\n golangci-lint run -v\n\nworkflows:\n version: 2\n go-helloworld:\n when: << pipeline.parameters.go-helloworld >>\n jobs:\n - go-helloworld-build\n - go-helloworld-test\n - go-helloworld-lint\n",
"parameters": {
"go-helloworld": true
}
}
確かにワークフローを生成しており、"go-helloworld": true
となっている。
そしてgo-helloworld
ワークフローも実行されている
ref: https://app.circleci.com/pipelines/github/korosuke613/playground/9/workflows/2cd478d3-c0a6-489a-b058-64066976930c
なかなか便利そうだ。だがやはりmappingに引っ掛からなかったときはworkflowを実行しないようなオプションが欲しいな。コントリビューションチャンスか??
とりあえずmapping
に引っ掛からなかった時も落ちないようにした
...
jobs:
pass:
machine:
image: ubuntu-2004:202101-01
steps:
- run: echo "This job is nothing to do. Because without the job, the workflow will fail."
...
workflows:
version: 2
pass:
when:
not: << pipeline.parameters.go-helloworld >>
jobs:
- pass
...
実行
いいね。本当はワークフローを実行してほしくないけど。
path-filtering、なかなか便利。
ただ、上述した通りmapping
に引っ掛からなかったらconfig-path
で指定したyamlファイルを実行せずに終わってほしい。あと、いまいちどういうワークフローが出来上がったのか直感的にわかりづらい感は否めない。まあこれはsetup-workflow
側の話かな。