Slide 1

Slide 1 text

CircleCIと 半年間格闘してみた kobakei potatotips #18

Slide 2

Slide 2 text

Keisuke Kobayashi (kobakei) ● Coubic, Inc ● Android & Rails engineer ● Twitter @ksk_kbys ● GitHub, Qiita @kobakei

Slide 3

Slide 3 text

無料で使える予約システム Coubic (クービック) https://coubic.com

Slide 4

Slide 4 text

サロン・マッサージの 当日予約・直前予約アプリ

Slide 5

Slide 5 text

CircleCI 導入の前に

Slide 6

Slide 6 text

Why CI? / Why CircleCI? ● ビルド&ベータ版配布の自動化 ○ 手動でビルド&配布する時間が無駄 ○ チームの誰もが最新のベータに触れる → バグの早期発見、フィードバックしやすい環境 ● 導入コストが低い ○ コンテナ1個なら無料 ○ Androidサポート(苦労しないとは言ってない)

Slide 7

Slide 7 text

CircleCIを 導入する

Slide 8

Slide 8 text

circle.ymlをプロジェクトに追加 ● プロジェクトのルートにcircle.ymlを追加 ● 環境変数の設定や、実行したいテストや デプロイのコマンドを書く ● https://circleci.com/docs/android ここに大体書いてある

Slide 9

Slide 9 text

CircleCIにログインして設定 ● GitHubアカウントで登録/ログイン ● CIしたいプロジェクトを選ぶだけ

Slide 10

Slide 10 text

ここからが本題

Slide 11

Slide 11 text

今日話したいこと ● CircleCI稼働中に発生した問題 ● その対策 ○ ぐぐっても対策が見つからなくて、CircleCIの中の人に 問い合わせた内容含む

Slide 12

Slide 12 text

問題1 OutOfMemory

Slide 13

Slide 13 text

OutOfMemory問題 ● CircleCIはメモリ4GBまで ● この制限を超えるとジョブが失敗

Slide 14

Slide 14 text

対策 circle.ymlで JAVA_OPTS: “-Xms256m -Xmx512m”で JVMのメモリ使用量を指定

Slide 15

Slide 15 text

問題2 ライブラリを追加しまくるとやはり OutOfMemory

Slide 16

Slide 16 text

OutOfMemory再発 ● (多分)巨大なライブラリの追加で発生 ○ Dagger 2, EventBus, Stetho, etc ● assemble過程のdexタスクが並列で複数走るこ とによって発生 ○ dexはJAVA_OPTSでメモリを制御できない

Slide 17

Slide 17 text

対策 app/build.gradleに、dexOptionsを追加 ビルドが安定して通るまで値を下げていく

Slide 18

Slide 18 text

問題3 65K問題

Slide 19

Slide 19 text

65K問題 ● メソッド数が65Kを超えるとビルドできない ○ 機能追加、ライブラリ追加によって、65K問題に 遭遇 ● multidexを追加して対応(※) ● このときに、再びビルドに失敗するようになる ※ https://developer.android.com/intl/ja/tools/building/multidex.html

Slide 20

Slide 20 text

解決策 ● dexOptionsのjavaMaxHeapSizeを 1GBに増やした ○ multidexだとjavaMaxHeapSizeが小さすぎると ビルドできない ○ ビルドが通るまで、256MB → 512MB → 1GBと 増やして検証

Slide 21

Slide 21 text

まとめ ● CircleCI for Android は OOM との戦い ● 肝はJAVA_OPTS と javaMaxHeapSize ● 今では安定稼働しています

Slide 22

Slide 22 text

Thank you! Coubic Inc.