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

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

1f745ff900e1be51aedae18cae76593c?s=47 Kurochan
March 10, 2017

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

CircleCI Meetup Tokyo #2で話したものです

1f745ff900e1be51aedae18cae76593c?s=128

Kurochan

March 10, 2017
Tweet

Transcript

  1. CyberAgent, Inc. All Rights Reserved Scalaプロダクトのビルド高速化 黒崎 優太 @kuro_m88

  2. 黒崎 優太 @kuro_m88 • 株式会社サイバーエージェント ◦ AdTech Studio / Dynalyst

    エンジニア • 新卒2年目 • Scala, AWS, LXD 査読に参加しました 今書いています
  3. Scalaのコンパイルと言えば

  4. Scalaのコンパイルと言えば • 大規模プロジェクトだと遅い ◦ Dynalystの例: ▪ 100+ sub projects ▪

    400K+ lines (Scala) ◦ dotty(次世代コンパイラ)に期待 • 先人の知見
  5. 金の弾丸 出典: Scalaのコンパイル速度の話が聞きたいだろうし、するつもりだ https://www.slideshare.net/kiris60/scala-benchmarks

  6. AdTech StudioでのCircleCI • CircleCI Enterpriseを利用 ◦ 物理 ◦ 30+ Node

    ◦ 100+ Build Container ◦ Amebaのと合わせると国内最大規模
  7. Dynalystでのビルド方法

  8. None
  9. Dynalystのビルド方法(高速化前) • キャッシュを使ってビルド時間を短く ◦ (sbtの機能により)差分コンパイルされる ◦ ※ すべてのコンテナで全部のプロジェクトをビルド • コンテナをたくさん使ってテストは並列に

    ◦ コンテナごとにテストするプロジェクトを変えて分散 ◦ DBを使うテストは同一ホスト内で並列に走れない ◦ 実際には12コンテナ使ってます • それでも待たされる(20分くらい)ので改善したい
  10. ①: CircleCI→CircleCI Enterprise • まぁまぁ速くなった ◦ Enterprise採用ありがとうございます ◦ CPU ,

    Memory , Storage , Network • 結果: 成功
  11. • コンテナたくさんあるんだし、 コンパイルするプロジェクトも コンテナごとに分けたら速くなるのでは ②: コンパイルを並列にする

  12. None
  13. ②: コンパイルを並列にする • 余計遅くなった… • Container #0しかキャッシュが保存されて いない模様 • 差分コンパイルが効かないのが原因

    • 結果: 失敗
  14. • ビルド成果物を先頭コンテナにrsync すればキャッシュを保存してくれそう ③: 成果物をrsyncで先頭のコンテナに

  15. None
  16. ③: 成果物をrsyncで先頭のコンテナに • connection timed out

  17. ③: 成果物をrsyncで先頭のコンテナに • 頻繁にコケてしまう… ◦ 帯域制限してみたり、色々やったけどうまくい かず… • 結果: 失敗

  18. 困ったので調べた 出典: Cache save/restore algorithm - Build Environment - CircleCI

    Community Discussion https://discuss.circleci.com/t/cache-save-restore-algorithm/759
  19. 困ったので調べた 出典: Cache save/restore algorithm - Build Environment - CircleCI

    Community Discussion https://discuss.circleci.com/t/cache-save-restore-algorithm/759
  20. ④: 自前でビルドキャッシュを保存 • ビルドキャッシュをS3に自前でアップロード • ビルド時にキャッシュをダウンロードしてきて展開 • circle.ymlにこれを行うシェルスクリプトを書いた ◦ 代わりにCircleCIのビルドキャッシュ機能は

    使わない
  21. None
  22. ④: 自前でビルドキャッシュを保存 • 結果:

  23. 結果 • PR Buildが20分→8分に ◦ ※差分の量によって時間は変わります

  24. 改善点

  25. 改善点 • 並列ビルドをシェルスクリプトで書いてる ◦ sbtでいい感じにしたい • コンテナごとにビルド時間が偏るときがある ◦ 現状たまに手で再配置 •

    S3以外の場所にキャッシュを保存する ◦ DC内にストレージあったほうがコスト/速度的に よさそう ◦ コンテナごとにキャッシュを保存してくれると 嬉しいな(要望)