2022.10.24 【オンライン】CircleCIユーザーコミュニティミートアップ tokizo / @tokizuohモノレポにおける path-filtering利用時でも GitHub ステータスのRequiredを 機能させたい!
View Slide
自己紹介・ tokizo (@tokizuoh)・ 株式会社はてな マンガアプリチーム所属・ iOSアプリエンジニア2https://github.com/tokizuoh/circleci-test-2022-10-01今日のコード
LTの流れGE path-filtering, GitHub ステータス利用時の問E 問題解決のアプローチ手ÇÅE アプローチ手法の課題3
4% path-filtering, GitHub ステータスのRequired 利用時の問題
5まずは用語の説明
用語・path-filtering・GitHub ステータスのRequired6
用語・path-filtering・GitHub ステータスのRequired7
path-filtering *1・CircleCI公式のOrb・変更されたファイルに応じてパイプラインパラメータを 制御できる*1 https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering8
path-filtering *1・CircleCI公式のOrb・変更されたファイルに応じてパイプラインパラメータを 制御できる*1 https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering9⇒ コミットに応じて実行する ワークフローを動的に変更できるコミット内容に応じて 実行するワークフローを 動的に変更できる
path-filtering 利用時の流れ/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCI10
path-filtering 利用時の流れ 11/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCI変更あり
path-filtering 利用時の流れ/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCI変更あり12
path-filtering コード.circleci/config.yml13
path-filtering コード.circleci/config.yml① androidディレクトリ配下に変更があれば build-android をtrueに ② 反映した値は後続の設定ファイルに引き継がれる①②14
path-filtering コード 15.circleci/continue-config.yml
path-filtering コード 16.circleci/continue-config.yml
path-filtering メリット・コミット内容に応じて実行するワークフローを動的に 変更できる ⇒ 不必要なビルドを行わなくて済む17
用語・path-filtering・GitHub ステータスのRequired18
GitHub ステータス *2・ 少しややこしい ・ GitHub Checks ・ GitHub ステータス (今日はこっち) ⇒ CircleCIではジョブごとに列挙*2 https://circleci.com/docs/ja/enable-checks/19
GitHub ステータス 20
GitHub ステータスのRequired 21
path-filtering, GitHub ステータスのRequired 利用時の問題22
問題・path-filteringを使うとGitHub ステータスの RequiredにPRのマージ時にグリーンになってほしい ジョブを指定できない⇒ 安全にPRをマージできない!23
問題/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCIRequiredRequired24
問題/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCIRequiredRequired変更あり25
問題/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCIRequiredRequired変更あり26
問題/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCIRequiredRequired変更あり27ios-test-jobは実行されない→ Requiredの項目がグリーンに ならない→ マージできない
2. 問題解決のアプローチ手法28
アプローチ・あるコミットに対して、”PRマージ時にグリーンに なってほしいジョブを含むワークフローがグリーンに なっているか”をチェックするジョブを GitHub ステータスのRequiredに指定する29
アプローチ/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobCircleCIRequiredRequired30
アプローチ/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobworkflow-status-check-jobNew !CircleCIRequiredRequired31
アプローチ/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobworkflow-status-check-jobNew !CircleCIRequiredRequiredRequired32
アプローチ/ios/androidGitHubGitHubandroid-test-jobpath-filtering/filterios-test-jobworkflow-status-check-jobNew !CircleCIRequiredRequiredRequired33PRマージ時にグリーンになってほしいジョブ (android-test-job や ios-test-job) を含むワークフローがグリーンになっていたらグリーンになるジョブworkflow-status-check-job
workflow-status-check-job の実装34
workflow-status-check-jobの実装・ CircleCI API v2 (*3) を利用して実現する・ 全体の実行時間は13秒程度*3: https://circleci.com/docs/api/v2/index.html35
workflow-status-check-jobの実装直近に実行したパイプラインのリストを取得Step 1パイプラインに紐づくワークフローを取得Step 2ワークフローの状態を取得Step 3特定のワークフローが成功していたら自分自身をグリーンにするStep 4CircleCI API v2CircleCI API v2CircleCI API v236→ Requiredにしたいジョブを含むワークフロー
いつ実行させる?37
いつ実行させる?/ios/androidGitHubGitHubandroid-test-jobpath-filteringios-test-jobworkflow-status-check-jobCircleCIRequired38
いつ実行させる?/ios/androidGitHubGitHubandroid-test-jobpath-filteringios-test-jobworkflow-status-check-jobCircleCIRequired確認対象のワークフローが 終わった後に実行させたいworkflow-status-check-job39
いつ実行させる?/ios/androidGitHubGitHubandroid-test-jobpath-filteringios-test-jobworkflow-status-check-jobCircleCIRequired確認対象のワークフローが 終わった後に実行させたい↓確認対象のワークフロー内の 最後のジョブでRerunさせるworkflow-status-check-jobCircleCI API v240
なぜRerun? そこで初めて実行すれば? 41https://circleci.com/docs/api/v2/index.html#tag/Workflow→ 単体のワークフローを実行するAPIが 無いため、一度実行させてからRerun
実行結果42
実行結果(成功する場合) 43
実行結果(成功する場合) 44マージ時にグリーンになってほしいジョブ (ios-test-job) が グリーンになったのでRequiredの項目をグリーンに!
実行結果(失敗する場合) 45
実行結果(失敗する場合) 46マージ時にグリーンになってほしいジョブ (ios-test-job) が レッド。Requiredの項目はレッドのまま!
問題を振り返る47
問題・path-filteringを使うとGitHub ステータスの RequiredにPRのマージ時にグリーンになってほしい ジョブを指定できないため、PRを安全にマージできない48
問題に対してのアプローチ手法の効果→ PRのマージ時にグリーンになってほしいジョブを含む ワークフローの状態を取得するジョブをRequiredに することでPRを安全にマージできるようになった49
問題に対してのアプローチ手法の効果→ PRのマージ時にグリーンになってほしいジョブを含む ワークフローの状態を取得するジョブをRequiredに することでPRを安全にマージできるようになった50解 決
3. アプローチ手法の課題51
アプローチ手法の課題・コードのメンテナンスの属人化 ・CircleCI APIを利用するコードの言語何にするか問題 ・チームの導入を考えるとチーム内共通言語(iOSならSwift) で書いたほうがメンテナンス性が上がる52コード: https://github.com/tokizuoh/circleci-test-2022-10-01
完