Slide 1

Slide 1 text

2022.10.24
 【オンライン】CircleCIユーザーコミュニティミートアップ
 tokizo / @tokizuoh モノレポにおける
 path-filtering利用時でも
 GitHub ステータスのRequiredを
 機能させたい!

Slide 2

Slide 2 text

自己紹介 ・ tokizo (@tokizuoh) ・ 株式会社はてな マンガアプリチーム所属 ・ iOSアプリエンジニア 2 https://github.com/tokizuoh/circleci-test-2022-10-01 今日のコード

Slide 3

Slide 3 text

LTの流れ GE path-filtering, GitHub ステータス利用時の問 E 問題解決のアプローチ手Ç ÅE アプローチ手法の課題 3

Slide 4

Slide 4 text

4 % path-filtering,
 GitHub ステータスのRequired
 利用時の問題

Slide 5

Slide 5 text

5 まずは用語の説明

Slide 6

Slide 6 text

用語 ・path-filtering ・GitHub ステータスのRequired 6

Slide 7

Slide 7 text

用語 ・path-filtering ・GitHub ステータスのRequired 7

Slide 8

Slide 8 text

path-filtering *1 ・CircleCI公式のOrb ・変更されたファイルに応じてパイプラインパラメータを
  制御できる *1 https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering 8

Slide 9

Slide 9 text

path-filtering *1 ・CircleCI公式のOrb ・変更されたファイルに応じてパイプラインパラメータを
  制御できる *1 https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering 9 ⇒ コミットに応じて実行する
 ワークフローを動的に変更できる コミット内容に応じて
 実行するワークフローを
 動的に変更できる

Slide 10

Slide 10 text

path-filtering 利用時の流れ /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI 10

Slide 11

Slide 11 text

path-filtering 利用時の流れ 11 /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI 変更あり

Slide 12

Slide 12 text

path-filtering 利用時の流れ /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI 変更あり 12

Slide 13

Slide 13 text

path-filtering コード .circleci/config.yml 13

Slide 14

Slide 14 text

path-filtering コード .circleci/config.yml ① androidディレクトリ配下に変更があれば build-android をtrueに
 ② 反映した値は後続の設定ファイルに引き継がれる ① ② 14

Slide 15

Slide 15 text

path-filtering コード 15 .circleci/continue-config.yml

Slide 16

Slide 16 text

path-filtering コード 16 .circleci/continue-config.yml

Slide 17

Slide 17 text

path-filtering メリット ・コミット内容に応じて実行するワークフローを動的に
  変更できる  ⇒ 不必要なビルドを行わなくて済む 17

Slide 18

Slide 18 text

用語 ・path-filtering ・GitHub ステータスのRequired 18

Slide 19

Slide 19 text

GitHub ステータス *2 ・ 少しややこしい  ・ GitHub Checks  ・ GitHub ステータス (今日はこっち)   ⇒ CircleCIではジョブごとに列挙 *2 https://circleci.com/docs/ja/enable-checks/ 19

Slide 20

Slide 20 text

GitHub ステータス 20

Slide 21

Slide 21 text

GitHub ステータスのRequired 21

Slide 22

Slide 22 text

path-filtering,
 GitHub ステータスのRequired
 利用時の問題 22

Slide 23

Slide 23 text

問題 ・path-filteringを使うとGitHub ステータスの
  RequiredにPRのマージ時にグリーンになってほしい
  ジョブを指定できない ⇒ 安全にPRをマージできない! 23

Slide 24

Slide 24 text

問題 /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI Required Required 24

Slide 25

Slide 25 text

問題 /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI Required Required 変更あり 25

Slide 26

Slide 26 text

問題 /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI Required Required 変更あり 26

Slide 27

Slide 27 text

問題 /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI Required Required 変更あり 27 ios-test-jobは実行されない → Requiredの項目がグリーンに
   ならない → マージできない

Slide 28

Slide 28 text

2. 問題解決のアプローチ手法 28

Slide 29

Slide 29 text

アプローチ ・あるコミットに対して、”PRマージ時にグリーンに
  なってほしいジョブを含むワークフローがグリーンに
  なっているか”をチェックするジョブを
  GitHub ステータスのRequiredに指定する 29

Slide 30

Slide 30 text

アプローチ /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job CircleCI Required Required 30

Slide 31

Slide 31 text

アプローチ /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job workflow-status-check-job New ! CircleCI Required Required 31

Slide 32

Slide 32 text

アプローチ /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job workflow-status-check-job New ! CircleCI Required Required Required 32

Slide 33

Slide 33 text

アプローチ /ios /android GitHub GitHub android-test-job path-filtering/filter ios-test-job workflow-status-check-job New ! CircleCI Required Required Required 33 PRマージ時にグリーンになってほしい ジョブ (android-test-job や ios-test- job) を含むワークフローがグリーンに なっていたらグリーンになるジョブ workflow-status-check-job

Slide 34

Slide 34 text

workflow-status-check-job
 の実装 34

Slide 35

Slide 35 text

workflow-status-check-jobの実装 ・ CircleCI API v2 (*3) を利用して実現する ・ 全体の実行時間は13秒程度 *3: https://circleci.com/docs/api/v2/index.html 35

Slide 36

Slide 36 text

workflow-status-check-jobの実装 直近に実行したパイプラインのリストを取得 Step 1 パイプラインに紐づくワークフローを取得 Step 2 ワークフローの状態を取得 Step 3 特定のワークフローが成功していたら自分自身をグリーンにする Step 4 CircleCI API v2 CircleCI API v2 CircleCI API v2 36 → Requiredにしたいジョブを含むワークフロー

Slide 37

Slide 37 text

いつ実行させる? 37

Slide 38

Slide 38 text

いつ実行させる? /ios /android GitHub GitHub android-test-job path-filtering ios-test-job workflow-status-check-job CircleCI Required 38

Slide 39

Slide 39 text

いつ実行させる? /ios /android GitHub GitHub android-test-job path-filtering ios-test-job workflow-status-check-job CircleCI Required 確認対象のワークフローが
 終わった後に実行させたい workflow-status-check-job 39

Slide 40

Slide 40 text

いつ実行させる? /ios /android GitHub GitHub android-test-job path-filtering ios-test-job workflow-status-check-job CircleCI Required 確認対象のワークフローが
 終わった後に実行させたい ↓ 確認対象のワークフロー内の
 最後のジョブでRerunさせる workflow-status-check-job CircleCI API v2 40

Slide 41

Slide 41 text

なぜRerun? そこで初めて実行すれば? 41 https://circleci.com/docs/api/v2/index.html#tag/Workflow → 単体のワークフローを実行するAPIが
   無いため、一度実行させてからRerun

Slide 42

Slide 42 text

実行結果 42

Slide 43

Slide 43 text

実行結果(成功する場合) 43

Slide 44

Slide 44 text

実行結果(成功する場合) 44 マージ時にグリーンになってほしいジョブ (ios-test-job) が
 グリーンになったのでRequiredの項目をグリーンに!

Slide 45

Slide 45 text

実行結果(失敗する場合) 45

Slide 46

Slide 46 text

実行結果(失敗する場合) 46 マージ時にグリーンになってほしいジョブ (ios-test-job) が
 レッド。Requiredの項目はレッドのまま!

Slide 47

Slide 47 text

問題を振り返る 47

Slide 48

Slide 48 text

問題 ・path-filteringを使うとGitHub ステータスの
  RequiredにPRのマージ時にグリーンになってほしい
  ジョブを指定できないため、PRを安全にマージできない 48

Slide 49

Slide 49 text

問題に対してのアプローチ手法の効果 → PRのマージ時にグリーンになってほしいジョブを含む
   ワークフローの状態を取得するジョブをRequiredに
   することでPRを安全にマージできるようになった 49

Slide 50

Slide 50 text

問題に対してのアプローチ手法の効果 → PRのマージ時にグリーンになってほしいジョブを含む
   ワークフローの状態を取得するジョブをRequiredに
   することでPRを安全にマージできるようになった 50 解
 決

Slide 51

Slide 51 text

3. アプローチ手法の課題 51

Slide 52

Slide 52 text

アプローチ手法の課題 ・コードのメンテナンスの属人化   ・CircleCI APIを利用するコードの言語何にするか問題  ・チームの導入を考えるとチーム内共通言語(iOSならSwift)
    で書いたほうがメンテナンス性が上がる 52 コード: https://github.com/tokizuoh/circleci-test-2022-10-01

Slide 53

Slide 53 text