process が肥大化して落ちる
CircleCI で Scala のプロジェクトを sbt test
しようとしたところ、コンテナで4GB以上使ったので異常終了したよ、とのエラーメッセージが出た。ssh login を有効にして様子を眺めていたところ、ひとつ目の java process が 1.7GB 程度まで大きくなった後、2つめの java process が出来上がり同じくらいまで大きくなっていった様子が確認できた。他に起動しているプロセスと合わせると4GBを超えていそうだ。
Playframework だとテストを fork した java process で実行することをすっかり忘れていた。
解決するにはそれぞれの java process が使うメモリ量を指示すれば良い。入っている sbt
は .sbtopts
を見てくれるやつなので、 circle.yml
に次のように書いてやれば良い。
dependencies:
pre:
- echo '-mem 800' >> .sbtopts
これでヒープに 800MB, PermGen に数百MB(忘れた)割り当てられるので 2 process 起動しても溢れない。少なくとも自分の環境では溢れなかった。あふれるようだったらもう少し調整すれば良い。
その他のはまりポイント
update-java-alternatives
自分のプロジェクトでは Java 7 syntax のコードが含まれており、そのままだと document 生成まわりで落ちた。sudo update-java-alternatives -s java-1.7.0-openjdk-amd64
すると落ちなくなった。
play コマンドを実行しようとして落ちる
そのままだと使っているバージョンと異なるバージョンの play コマンドで実行しようとして落ちた。
sbt を使うようにすれば良い。
dependencies:
override:
- sbt update
test:
override:
- sbt test
~/.sbt
をキャッシュする
~/.ivy2
はデフォルトでキャッシュされるので良いが、 ~/.sbt
はされない。
circle.yml
に次のように書く。
dependencies:
cache_directories:
- "~/.sbt"
git submodule
デフォルトでは submodule 取ってこないので circle.yml
に次のようにかけば良い。
checkout:
post:
- git submodule sync
- git submodule update --init
CircleCI の感想
- Private repository も無料で動かせるなんてスゴイ! いままで Drone.io の open source 版を動かしてたけど移行しようかな。
- CI のフェーズが整理されておりすんなり理解できた。
- うまくいかない時は SSH ログインしてチェックすることができるので、すばやく問題を解決することができた。Travis にはない強みだ。