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

PRのCI稼働時間を7割削減した話

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest. →

 PRのCI稼働時間を7割削減した話

度々上限停止していたGitHub ActionsのCIを、目的を崩さず3つの施策で見直した話。影響パッケージのみテスト・Draftはスキップ・DBコンテナ共有で、1 runあたり144分→39分(-73%)を達成しました。

More Decks by 株式会社イノベーション(エンジニア)

Other Decks in Programming

Transcript

  1. it-trend-api のCIを見る GitHub Actions の稼働時間のうち PR の CI が 9

    割 PR の CI のうち テストが 9 割 1 run あたり平均 144 分(並列ジョブの合計) PR を出すたびに約 30 分待つ 2026-06 の集計 6
  2. CIの目的は崩さない PR の CI の目的は、マージする時点で次を保証するためにある 1. build / format /

    lint が全部通っている 2. 必要十分なテストがされている → この 2 つを守ったまま削減する 7
  3. 1. 変更の影響があるパッケージだけテストする 変更前:PR で結合テスト以外の全部 / 日次で結合テスト → 結合テストが検査されない、変更に関係ないテストが走る 変更後:PR で

    変更の影響があるパッケージだけ / 日次で全テスト(保険) go list -deps -test -f '{{.ImportPath}} {{join .Deps " "}}' ./... 依存グラフから「変更パッケージに依存するもの」を拾う 9
  4. 2. Draft の状態ではテストしない PR の 7〜8 割が Draft で作られていた (AI

    が読む規約でも Draft 作成を指示している) マージの判定に使うのは 最後に走った CI だけ Draft 中のテストは、ほぼ無駄になっている → Draft の状態ではテストをしない、Ready にしたときに回す (build / format / lint は軽いので Draft でも回す) 10
  5. 3. DB コンテナをパッケージ内で共有する 変更前:テストケースごとに MySQL コンテナを起動 → 破棄 起動に 1

    回 約 13 秒。1 ケースの 6〜9 割が起動待ち 変更後:パッケージごとにDBコンテナを 1 回だけ起動し、テストケース間で共有する テストケースが終わるたびにデータを消して、ケース同士が影響しないようにす る 11
  6. 結果 対応 週 稼働時間(分)/run 対応前 2026-06-29 144 影響パッケージのみテスト 2026-07-13 54

    Draftでテストしない 2026-07-20 47 共有DB化 2026-09-07 39 144 → 39 分(-73%) 12