Upgrade to Pro — share decks privately, control downloads, hide ads and more …

モノレポにおける
path-filtering利用時でも
GitHub ステータスのRequiredを
機能させたい!

tokizo
October 24, 2022

モノレポにおける
path-filtering利用時でも
GitHub ステータスのRequiredを
機能させたい!

tokizo

October 24, 2022
Tweet

More Decks by tokizo

Other Decks in Programming

Transcript

  1. 2022.10.24

    【オンライン】CircleCIユーザーコミュニティミートアップ

    tokizo / @tokizuoh
    モノレポにおける

    path-filtering利用時でも

    GitHub ステータスのRequiredを

    機能させたい!

    View Slide

  2. 自己紹介
    ・ tokizo (@tokizuoh)

    ・ 株式会社はてな マンガアプリチーム所属

    ・ iOSアプリエンジニア
    2
    https://github.com/tokizuoh/circleci-test-2022-10-01
    今日のコード

    View Slide

  3. LTの流れ


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

    View Slide

  4. 4
    % path-filtering,

    GitHub ステータスのRequired

    利用時の問題

    View Slide

  5. 5
    まずは用語の説明

    View Slide

  6. 用語


    ・path-filtering

    ・GitHub ステータスのRequired
    6

    View Slide

  7. 用語


    ・path-filtering

    ・GitHub ステータスのRequired
    7

    View Slide

  8. path-filtering *1


    ・CircleCI公式のOrb

    ・変更されたファイルに応じてパイプラインパラメータを

     制御できる
    *1 https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering
    8

    View Slide

  9. path-filtering *1


    ・CircleCI公式のOrb

    ・変更されたファイルに応じてパイプラインパラメータを

     制御できる
    *1 https://circleci.com/developer/ja/orbs/orb/circleci/path-filtering
    9
    ⇒ コミットに応じて実行する

    ワークフローを動的に変更できる
    コミット内容に応じて

    実行するワークフローを

    動的に変更できる

    View Slide

  10. path-filtering 利用時の流れ


    /ios
    /android
    GitHub
    GitHub
    android-test-job
    path-filtering/filter
    ios-test-job
    CircleCI
    10

    View Slide

  11. path-filtering 利用時の流れ

    11
    /ios
    /android
    GitHub
    GitHub
    android-test-job
    path-filtering/filter
    ios-test-job
    CircleCI
    変更あり

    View Slide

  12. path-filtering 利用時の流れ


    /ios
    /android
    GitHub
    GitHub
    android-test-job
    path-filtering/filter
    ios-test-job
    CircleCI
    変更あり
    12

    View Slide

  13. path-filtering コード


    .circleci/config.yml
    13

    View Slide

  14. path-filtering コード


    .circleci/config.yml
    ① androidディレクトリ配下に変更があれば build-android をtrueに

    ② 反映した値は後続の設定ファイルに引き継がれる


    14

    View Slide

  15. path-filtering コード

    15
    .circleci/continue-config.yml

    View Slide

  16. path-filtering コード

    16
    .circleci/continue-config.yml

    View Slide

  17. path-filtering メリット


    ・コミット内容に応じて実行するワークフローを動的に

     変更できる

     ⇒ 不必要なビルドを行わなくて済む
    17

    View Slide

  18. 用語


    ・path-filtering

    ・GitHub ステータスのRequired
    18

    View Slide

  19. GitHub ステータス *2


    ・ 少しややこしい

     ・ GitHub Checks

     ・ GitHub ステータス (今日はこっち)

      ⇒ CircleCIではジョブごとに列挙
    *2 https://circleci.com/docs/ja/enable-checks/
    19

    View Slide

  20. GitHub ステータス

    20

    View Slide

  21. GitHub ステータスのRequired

    21

    View Slide

  22. path-filtering,

    GitHub ステータスのRequired

    利用時の問題
    22

    View Slide

  23. 問題


    ・path-filteringを使うとGitHub ステータスの

     RequiredにPRのマージ時にグリーンになってほしい

     ジョブを指定できない
    ⇒ 安全にPRをマージできない!
    23

    View Slide

  24. 問題


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

    View Slide

  25. 問題


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

    View Slide

  26. 問題


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

    View Slide

  27. 問題


    /ios
    /android
    GitHub
    GitHub
    android-test-job
    path-filtering/filter
    ios-test-job
    CircleCI
    Required
    Required
    変更あり
    27
    ios-test-jobは実行されない

    → Requiredの項目がグリーンに

      ならない

    → マージできない

    View Slide

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

    View Slide

  29. アプローチ


    ・あるコミットに対して、”PRマージ時にグリーンに

     なってほしいジョブを含むワークフローがグリーンに

     なっているか”をチェックするジョブを

     GitHub ステータスのRequiredに指定する
    29

    View Slide

  30. アプローチ


    /ios
    /android
    GitHub
    GitHub
    android-test-job
    path-filtering/filter
    ios-test-job
    CircleCI
    Required
    Required
    30

    View Slide

  31. アプローチ


    /ios
    /android
    GitHub
    GitHub
    android-test-job
    path-filtering/filter
    ios-test-job
    workflow-status-check-job
    New !
    CircleCI
    Required
    Required
    31

    View Slide

  32. アプローチ


    /ios
    /android
    GitHub
    GitHub
    android-test-job
    path-filtering/filter
    ios-test-job
    workflow-status-check-job
    New !
    CircleCI
    Required
    Required
    Required
    32

    View Slide

  33. アプローチ


    /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

    View Slide

  34. workflow-status-check-job

    の実装
    34

    View Slide

  35. workflow-status-check-jobの実装
    ・ CircleCI API v2 (*3) を利用して実現する

    ・ 全体の実行時間は13秒程度
    *3: https://circleci.com/docs/api/v2/index.html
    35

    View Slide

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

    View Slide

  37. いつ実行させる?
    37

    View Slide

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

    View Slide

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

    終わった後に実行させたい
    workflow-status-check-job
    39

    View Slide

  40. いつ実行させる?
    /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

    View Slide

  41. なぜRerun? そこで初めて実行すれば?

    41
    https://circleci.com/docs/api/v2/index.html#tag/Workflow
    → 単体のワークフローを実行するAPIが

      無いため、一度実行させてからRerun

    View Slide

  42. 実行結果
    42

    View Slide

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

    43

    View Slide

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

    44
    マージ時にグリーンになってほしいジョブ (ios-test-job) が

    グリーンになったのでRequiredの項目をグリーンに!

    View Slide

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

    45

    View Slide

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

    46
    マージ時にグリーンになってほしいジョブ (ios-test-job) が

    レッド。Requiredの項目はレッドのまま!

    View Slide

  47. 問題を振り返る
    47

    View Slide

  48. 問題


    ・path-filteringを使うとGitHub ステータスの

     RequiredにPRのマージ時にグリーンになってほしい

     ジョブを指定できないため、PRを安全にマージできない
    48

    View Slide

  49. 問題に対してのアプローチ手法の効果


    → PRのマージ時にグリーンになってほしいジョブを含む

      ワークフローの状態を取得するジョブをRequiredに

      することでPRを安全にマージできるようになった
    49

    View Slide

  50. 問題に対してのアプローチ手法の効果


    → PRのマージ時にグリーンになってほしいジョブを含む

      ワークフローの状態を取得するジョブをRequiredに

      することでPRを安全にマージできるようになった
    50
    解


    View Slide

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

    View Slide

  52. アプローチ手法の課題


    ・コードのメンテナンスの属人化

      ・CircleCI APIを利用するコードの言語何にするか問題

     ・チームの導入を考えるとチーム内共通言語(iOSならSwift)

       で書いたほうがメンテナンス性が上がる
    52
    コード: https://github.com/tokizuoh/circleci-test-2022-10-01

    View Slide


  53. View Slide