2021年4月26日月曜日

CircleCI でモノレポ上の指定パスに変更があったらテストを走らせる

 「GitHub Actions でモノレポ上の変更があったプロジェクトだけテストを走らせる
これを読んで、

からの

これで、公式から記事も紹介してもらったのでやってみた。

Setup Wrokflows とは
現在 OpenPreview 中の機能です。
最初に読み込む config.yml がセットアップワークフローになって、後続のワークフローを動的に構築できる感じですかね。
その1つの使い方として、変更があったパスごとに実行するワークフローを変えるとかができるってことですね。
使い方は公式記事を見ると良いと思いますが、こちらでも簡単に手順を追ってみます。

  1. 「Project Settings」の「Advanced」にある「Run Setup Workflows (PREVIEW)」を有効にする

  2. config.yml に「setup: true」を足すとセットアップワークフローになります
  3. あとは、もともと config.yml にあったワークフローを別ファイルにし、config.yml にはセットアップワークフローを書く感じになります。
試してみた

実際にやってみないとわからないので、タイトルに書いたとおりパスフィルターを設定して特定のワークフローを実行させてみました。
パスフィルターには「Path filtering Orb」が必要になります。使い方はリンク先もしくは、試してみたリポジトリの YAML を見ればわかると思いますが、こちらでも説明していきます。

https://github.com/srz-zumix/ci-trigger/pull/15

まずはもともとあった config.yml を別ファイルにリネームします。
これはセットアップワークフローから呼び出すファイルになります。

次に config.yml を以下のように書きます。

version: '2.1'
# Enable the Setup Workflows setting to true (it is under “Advanced” in the project settings)
setup: true

orbs:
  path-filtering: circleci/path-filtering@0.0.1

workflows:
  generate-config:
    jobs:
      - path-filtering/filter:
          base-revision: master
          config-path: .circleci/path-filtered-config1.yml
          mapping: |
            .circleci/.* build-pipeline true
            README.md build-docs true

      # https://twitter.com/srz_zumix/status/1385426925531762691
      # {"message":"Pipeline is not in setup state."}
      # - path-filtering/filter:
      #     base-revision: master
      #     config-path: .circleci/path-filtered-config2.yml
      #     mapping: |
      #       .circleci/.* build-pipeline true
      #       README.md build-docs true

「setup: true」を忘れると怒られます。

config-path にはリネームした config.yml を書く感じになると思います。ここに指定した YAML に定義されたワークフローをパラメーター付きで実行することになります。
mapping にパスフィルター(正規表現)とフィルターマッチしたときに付与するパラメーターを指定します。
↑の例では .circleci/ 以下のファイルに変更があったときに「build-pipeline: true」
README.md に変更があったときには「build-docs: true」が与えられます。
(base-revision は差分の比較対象になるブランチ名です。今回は master としてますが、PR の場合は base branch にしたくなる気がしてます。こちらは課題として引き続き検証したいと思います。)

最後に呼び出される YAML にパラメーターの定義とワークフローの when で条件付けします。
パラメーター定義

version: 2.1
parameters:
  build-docs:
    type: boolean
    default: false
  build-pipeline:
    type: boolean
    default: false
  build-other:
    type: boolean
    default: false

条件付け

workflows:
  build-docs:
    when: << pipeline.parameters.build-docs >>
    jobs:
      - build
  build-pipeline:
    when: << pipeline.parameters.build-pipeline >>
    jobs:
      - build
  build-other:
    when: << pipeline.parameters.build-other >>
    jobs:
      - build

こちらの実行結果が↓です。
セットアップジョブには「SETUP」ってついてますね。
この PR には .circleci/.* と README.md どちらも差分があるので、セットアップの実行後に、 build が pipeline/docs の分の2つが実行されました。(other は実行されない)

また、README.md だけの更新 PR の場合は↓です。

ちゃんと build-docs だけの実行になってますね!

ちなみにセットアップジョブを複数書いたらどうなるかも試しました。
↑の config.yml のコメントを外して試してみたのですが、エラーで片方しか実行できませんでした。

こちらは自分の書き方が悪いだけかもしれませんが、追い検証はのちのち。。
最後に

CircleCI がどんどん便利になっていくなーと感じました。
今回はパスフィルターを使って、パラメーターから when で実行するワークフローを on/off させましたが、パラメーターは step 型も扱えちゃうので複雑な制御もいろいろできそうだなと思いました。

セットアップワークフローはまだ Preview 状態なので、引き続きウォッチしていきたいと思います。では。


0 件のコメント:

コメントを投稿