Closed11

CircleCI Cloudのpath-filteringを試してみる

必要なのは二つのyamlファイル。
.circleci/config.ymlpath-filteringで実行される任意のyamlファイル(ここでは.circleci/go.ymlにする)。

まずは通常実行される.circleci/config.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

  1. setup: trueでsetup workflowを有効にする
  2. orbspath-filtering: circleci/path-filtering@0.0.2を指定し、path-fileteringを使えるようにする。
  3. setup-workflowワークフロー[1]を作る
    1. config-pathに後続のyamlファイルを指定する
    2. mappingで監視したいファイルとtrueにしたいパラメータを設定する。この場合はgo/helloworld以下の任意のファイルが変更されていたらgo-hello-worldパラメータをtrueにすることになる
脚注
  1. 名前はなんでもいい??わからん ↩︎

次はconfig-pathに指定したyamlファイルを作る。

.circleci/go.yml
# 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

  1. 先ほどmappingで指定したgo-helloworldパラメータをparametersに作る。booleanでデフォルト値falseにする。
  2. 操作したいワークフローに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
  }
}

ref: https://app.circleci.com/pipelines/github/korosuke613/playground/9/workflows/2c11436e-c634-45b8-8e96-ade6b09e4335/jobs/17

確かにワークフローを生成しており、"go-helloworld": trueとなっている。

そしてgo-helloworldワークフローも実行されている
ref: https://app.circleci.com/pipelines/github/korosuke613/playground/9/workflows/2cd478d3-c0a6-489a-b058-64066976930c

なかなか便利そうだ。だがやはりmappingに引っ掛からなかったときはworkflowを実行しないようなオプションが欲しいな。コントリビューションチャンスか??

とりあえずmappingに引っ掛からなかった時も落ちないようにした

.circleci/go.yml

...

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側の話かな。

このスクラップは2021/04/25にクローズされました
ログインするとコメントできます