Slide 1

Slide 1 text

2025年9月26日 2 分 台 で 1 5 0 0 e x a m p l e s 完 走 ! 爆 速 C I を 支 え る 環 境 構 築 術 株式会社TwoGate 取締役CTO 奥本 隼

Slide 2

Slide 2 text

奥本 隼 (Hayato OKUMOTO) @falcon_8823 株式会社TwoGate 取締役CTO チーム組成から12年 / 創業10期目 長野高専出身 Rails歴14年 自己紹介

Slide 3

Slide 3 text

TwoGateの主要なソリューション ライブイベント向け OEM型モバイルオーダーアプリ オンラインくじ ファンクラブアプリ チケットサイト Shopify EC構築支援 その他の事業領域 ライブエンタメ領域に対して、 コンパウンド戦略でサービスを複数展開 しています。 150 150 9 200 実績数

Slide 4

Slide 4 text

Caravan - イベント物販に特化したアプリ

Slide 5

Slide 5 text

技術スタック サーバサイド フロントエンド インフラ

Slide 6

Slide 6 text

ピークトラフィック CDN 50,000 RPS ALB / Rails 8,000 RPS 決済エンドポイント 660 RPS

Slide 7

Slide 7 text

https://aws.amazon.com/jp/blogs/startup/tech-interview-twogate-2025/

Slide 8

Slide 8 text

Rails × 爆速CI 本発表のテーマ

Slide 9

Slide 9 text

なぜCIを速くしたい? 失敗の早期発見 不具合の原因特定と修正のサイクルを早く回せる リリースの早期化 安定したリリースを早期にできる 開発体験の向上 遅いとイライラするよね!

Slide 10

Slide 10 text

CIが高速=ビジネスに直結 TwoGateのプロダクト=ライブ会場で使われる 問題があれば即時対応、即時反映する必要がある そこに炎天下の中待っているお客さんたちが!!!

Slide 11

Slide 11 text

TwoGateのCI環境 GitLab CE + GitLab Runner DockerコンテナベースのCI環境 EC2にてAuto Scaling + Spot Instanceで運用 iOSアプリビルド用にMac miniをオンプレでも管理

Slide 12

Slide 12 text

題材 TRIPLE - OEM型チケット販売プラットフォーム Rails(Ruby 3.3/Rails 7.1/sorbet)+PostgreSQL+Redis Code: 19,035 Test: 58,182 Code to Test Ratio: 1:3.1 C0 Cov: 80.4%

Slide 13

Slide 13 text

bundle exec rspec 1,981examples APIベースのアプリケーションなので比較的軽量なテスト 単体テスト / APIテスト 実行時間:29分38秒 EC2 c7i.2xlarge (8vCPU / 16GB)

Slide 14

Slide 14 text

今日のテーマ 話さないこと specそのものの改善(既にたくさんの知見が既発表) 話すこと 並列実行による高速化 CI環境ののチューニングの話し

Slide 15

Slide 15 text

RSpecの実行を速くするためには 直列実行でCPUを使い切れていない 2コアなのに1コアしか使っていない 並列実行すればよい => どうする?

Slide 16

Slide 16 text

parallel_tests gem Rubyのテストフレームワークの並列実行をサポートする RSpec / Minitest / Turnip / Cucumberなどに対応 マルチプロセスでの並列実行をサポート そのまま実行すると…? DatabaseCleanerも同時実行されて、テストできない…

Slide 17

Slide 17 text

論理DBを分ける parallel_testの機能に存在 TEST_ENV_NUMBER環境変数にプロセスごとの番号が入る

Slide 18

Slide 18 text

均等に並列化されない Process 1 spec単位での実行時間にはバラツキがある 均等に並列実行しないと意味が無い Process 2 Process 3 Process 4 20分 10分 5分 15分 Process 1 Process 2 Process 3 Process 4 13分 13分 13分 13分 現実 理想 ???

Slide 19

Slide 19 text

Knapsack Pro spec単位の実行時間の履歴を記録して最適な分割をしてくれ る gemを入れてセットアップする

Slide 20

Slide 20 text

rake parallel:spec 条件 8コアCPUで8並列で実行 (1/8になる??) 実行環境 EC2 c7i.2xlarge (8vCPU/16GB) 実行時間 23分20秒 (元:29分38秒) ???

Slide 21

Slide 21 text

I/Oに気をつけろ EC2のEBS(gp3)のデフォルトは3,000IOPS 8並列ではDB書き込みでIOがサチる

Slide 22

Slide 22 text

I/Oスペックを上げるには EBSのIOPSを上げる 課金する? NVMe SSDを使う (EC2ではストレージ最適タイプ) 悪くない。マウントポイントの設定などが要。 1-3万IOPS ??? 速い!

Slide 23

Slide 23 text

tmpfsを使う メモリ上に作成できるファイルシステム 再起動で揮発する / RAMより大きい領域は確保できない Dockerのオプションからも簡単に利用可能 --tmpfs=/var/lib/postgresql GitLab Runnerではこの2行の設定を書くだけ

Slide 24

Slide 24 text

rake parallel:spec w/tmpfs 条件 8コアCPU で実行 + ストレージをtmpfsに 実行環境 EC2 c7i.2xlarge (8vCPU/16GB) 実行時間 5分 (元:29分38秒) 6倍スピードアップ

Slide 25

Slide 25 text

もっと速くしよう さらなるスピードに挑戦?

Slide 26

Slide 26 text

もっと速くしよう https://world.hey.com/dhh/we-have-left-the-cloud-251760fb

Slide 27

Slide 27 text

物理マシンにする 👊👊👊 CPU: Ryzen 9 / RAM: 64GB / SSD: NVMe 4.5GHz / 32コア 実行時間:32並列 / 1分59秒!! 約30分のCIが2分で完了(15倍)

Slide 28

Slide 28 text

コストメリット 32core / 64GBのマシンを手に入れるには EC2 c7i.8xlarge: 1,294.27USD/month = 19.5万/月 オンデマンドインスタンス 物理: 24万円 = 減価償却4年: 5,000円/月  仮にspotインスタンスでも10倍ぐらいの価格差

Slide 29

Slide 29 text

まとめ RSpecを並列に実行すること 均等に並列実行すること(大事) tmpfsを使うこと 物理マシンを使うこと(一番大事) CIサーバは可用性含めて着手しやすいはず 約30分のCIが2分で完了(15倍) コストが1/10 〜 1/40に