「GitHub Actions でモノレポ上の変更があったプロジェクトだけテストを走らせる」
これを読んで、
ちなみに書きかけだけど paths みたいなパスでトリガーをフィルターできるかどうかはここでまとめてる。https://t.co/QtlDVDQI4B
— ずみっくす@あつまれCIサービス (@srz_zumix) April 22, 2021
からの
ぜひぜひお試しのほど、よろしくお願いいたします!https://t.co/XblLXJaVvR
— CircleCI Japan (@CircleCIJapan) April 23, 2021
これで、公式から記事も紹介してもらったのでやってみた。
Setup Wrokflows とは
最初に読み込む config.yml がセットアップワークフローになって、後続のワークフローを動的に構築できる感じですかね。
その1つの使い方として、変更があったパスごとに実行するワークフローを変えるとかができるってことですね。
使い方は公式記事を見ると良いと思いますが、こちらでも簡単に手順を追ってみます。
- 「Project Settings」の「Advanced」にある「Run Setup Workflows (PREVIEW)」を有効にする
- config.yml に「setup: true」を足すとセットアップワークフローになります
- あとは、もともと 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」を忘れると怒られます。
> CIRCLE_CONTINUATION_KEY is required. Make sure setup workflows are enabled.
— ずみっくす@あつまれCIサービス (@srz_zumix) April 23, 2021
はて?
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 のコメントを外して試してみたのですが、エラーで片方しか実行できませんでした。
> {"message":"Pipeline is not in setup state."}
— ずみっくす@あつまれCIサービス (@srz_zumix) April 23, 2021
うーん、2個はダメか? pic.twitter.com/Df2s64sE1W
最後に
CircleCI がどんどん便利になっていくなーと感じました。
今回はパスフィルターを使って、パラメーターから when で実行するワークフローを on/off させましたが、パラメーターは step 型も扱えちゃうので複雑な制御もいろいろできそうだなと思いました。
セットアップワークフローはまだ Preview 状態なので、引き続きウォッチしていきたいと思います。では。
0 件のコメント:
コメントを投稿