CyberAgent, Inc. All Rights Reserved
Scalaプロダクトのビルド高速化
黒崎 優太 @kuro_m88
黒崎 優太 @kuro_m88
● 株式会社サイバーエージェント
○ AdTech Studio / Dynalyst エンジニア
● 新卒2年目
● Scala, AWS, LXD
査読に参加しました 今書いています
Scalaのコンパイルと言えば
Scalaのコンパイルと言えば
● 大規模プロジェクトだと遅い
○ Dynalystの例:
■ 100+ sub projects
■ 400K+ lines (Scala)
■ 18K+ builds (50 builds / day)
○ dotty(次世代コンパイラ)に期待
● 先人の知見
金の弾丸
出典: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ
https://www.slideshare.net/kiris60/scala-benchmarks
AdTech StudioでのCircleCI
● CircleCI Enterpriseを利用
○ 物理
○ 30+ Node
○ 100+ Build Container
○ Amebaのと合わせると国内最大規模
○ コストパフォーマンス
Dynalystでのビルド方法
Dynalystのビルド方法(高速化前)
● キャッシュを使ってビルド時間を短く
○ (sbtの機能により)差分コンパイルされる
○ ※ すべてのコンテナで全部のプロジェクトをビルド
● コンテナをたくさん使ってテストは並列に
○ コンテナごとにテストするプロジェクトを変えて分散
○ DBを使うテストは同一ホスト内で並列に走れない
○ 実際には12コンテナ使ってます
● それでも待たされる(20分くらい)ので改善したい
①: CircleCI→CircleCI Enterprise
● まぁまぁ速くなった
○ Enterprise採用ありがとうございます
○ CPU , Memory , Storage , Network
● 結果: 成功
● コンテナたくさんあるんだし、
コンパイルするプロジェクトも
コンテナごとに分けたら速くなるのでは
②: コンパイルを並列にする
②: コンパイルを並列にする
● 余計遅くなった…
● Container #0しかキャッシュが保存されて
いない模様
● 差分コンパイルが効かないのが原因
● 結果: 失敗
● ビルド成果物を先頭コンテナにrsync
すればキャッシュを保存してくれそう
③: 成果物をrsyncで先頭のコンテナに
③: 成果物をrsyncで先頭のコンテナに
● connection timed out
③: 成果物をrsyncで先頭のコンテナに
● 頻繁にコケてしまう…
○ 帯域制限してみたり、色々やったけどうまくい
かず…
● 結果: 失敗
困ったので調べた
出典: Cache save/restore algorithm - Build Environment - CircleCI Community Discussion
https://discuss.circleci.com/t/cache-save-restore-algorithm/759
困ったので調べた
出典: Cache save/restore algorithm - Build Environment - CircleCI Community Discussion
https://discuss.circleci.com/t/cache-save-restore-algorithm/759
④: 自前でビルドキャッシュを保存
● ビルドキャッシュをS3に自前でアップロード
● ビルド時にキャッシュをダウンロードしてきて展開
● circle.ymlにこれを行うシェルスクリプトを書いた
○ 代わりにCircleCIのビルドキャッシュ機能は
使わない
④: 自前でビルドキャッシュを保存
● 結果:
結果
● PR Buildが20分→8分に
○ ※差分の量によって時間は変わります
改善点
改善点
● 並列ビルドをシェルスクリプトで書いてる
○ sbtでいい感じにしたい
● コンテナごとにビルド時間が偏るときがある
○ 現状たまに手で再配置
● S3以外の場所にキャッシュを保存する
○ DC内にストレージあったほうがコスト/速度的に
よさそう
○ 標準でコンテナごとにキャッシュを保存してくれると嬉
しいな(要望)

Scalaプロダクトのビルド高速化