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内にストレージあったほうがコスト/速度的に よさそう ○ コンテナごとにキャッシュを保存してくれると 嬉しいな(要望)