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