chigichan24のお気持ち表明

イケてるエンジニアになりたい.

mainframerで外部ビルド環境を作った話

最近

  • 購入して一年も経ったMacBook Pro(メモリ 8GB)でAndroid Studio × 3,XCode,RubyMine,PyCharm,Chrome(タブ50個 over)とかで開発を同時多発的にやっていると コンピュータが重くて重くて しかたなかった.

  • 特にAndroid Studioを触る機会が多いが,他人のコードをレビューする際にDatabindingやdaggerで生成された静的ファイルを一度消してビルドする必要があり(clean build & rebuild)それが重すぎて重すぎてコンパイルしている時は 虚無 になって Perfumeのことを考えるくらいしかやることがなく ,非常に時間がもったいないと感じていた.

そこで!!
  • せめてAndroidのビルドだけでも外の環境に投げてその間でも開発が続けられるようにーと思って,mainframerを導入してみました.

mainframerとは?

github.com

  • これのことで,要するに,gradleとsourceファイルをみて,remote buildする環境を提供してくれるやつです.

  • Android Studioにはこれを支援するPluginが入っているので,localの設定はそんなにしんどくありません.

  • remoteもDockerなどで,ビルド環境を再現してあげればもう簡単に,ヒョイとできます.

Remoteの設定

  • AWSなりなんなりに適当なインスタンスを建てる.
  • OracleJRE(openJREだとkapt + databinding あたりがバグった)を入れる.
  • SDKHandlerで,作りたい環境にあったバージョンのSDKを入れる.
  • licenseという概念があり,これが正しく認証されないとビルドができないので,きちんと指定します.

Localの設定

  • そもそも,普段./gradlewをあまり使わない人だと,gradle/wrapperの下にgradle-wrapper.jarがなかったりするので作っておく.
  • Plugin から,Mainframer Integrationを入れる.
  • 先に設定したRemoteを~/.ssh/configに書いて,それをAndroid Studioの Mainframer constructionで指定する.

ハマりポイント

  • 適当な権限でremoteのSDKやlicenseを指定すると書き込みや実行権限が振られずに正しくビルドできないのでディレクトリごと権限振る,ちゃんとユーザーを作るなどする必要があります.

  • 規模によりますが,私のやっていたコードの場合t2microで立てたらビルドが終わらずに途中で死んでました.多分CPU,メモリスペックともにそれなりなものを選択する必要があります.(私はt2-largeを選択しましたがそれでもCPU使用率が200%近い時がありました.)

結果

Before(普通にローカルでやる)

gifなのですが容量の問題でループできなかったのでリロードして確認してみると遅いことが分かるかと思います.

f:id:chigichan24:20180418202953g:plain

After(remote でビルドする)

f:id:chigichan24:20180418180652g:plain

お気持ち

  • localでやっていた時,フルビルドで最悪7-8[min] 早いときでも2[min]程掛かっていたビルドが,最悪でも 2[min] ,早い時は数秒でビルドが終わるので開発効率が上がりました.

  • ビルドしている時にコンピュータが重くならないので,なにか別の作業をすることもできます..コンピュータのファンが唸らない!!

  • これはまだやってませんがついでにCIもCircleCIやTravisに頼ることなく自前で回せます.

まとめ

  • これで作業が遅いことをPCのせいにする言い訳ができなくなった...