読者です 読者をやめる 読者になる 読者になる

visible true

技術的なメモを書く

Androidアプリケーションのビルド体験を改善するリモートビルドサービス Cyborg-Build を作りました

はじめに

これはAndroid Advent Calendar 2016の20日目のエントリです。

本エントリではAndroidアプリケーションのビルド体験を改善するリモートビルドサービス Cyborg Build を紹介します。

背景

以前AndroidアプリケーションをGoogle Compute Engineのインスタンスでビルドする - visible trueクラウド上にインスタンスを作ってAndroidアプリケーションのビルドを代行させる方法について書きました。エントリでは低スペックなインスタンスでの試用でしたが、その後いくつかのインスタンスを試しGCEではn1-highcpu-8(vCPU x 8、メモリ 7.2 GB)くらいのスペックがパフォーマンスとコストのバランスが良いとわかりました*1

パフォーマンスとコストのバランスが良いと言ってもn1-highcpu-8は一ヶ月フル稼働で$150ほどかかります。インスタンスの可用性の設定をプリエンプティブにすれば$44くらいまで抑えられますが、プリエンプティブインスタンスは最長で24時間の稼働という制限があるので、インスタンスの起動処理などを別途行う必要があります。さらに最長で24時間といっても5分で落ちるケースもあるので安定的な動作をさせたい場合は色々と工夫が必要になります。

gcloudなどを使ってインスタンスの状態を見て起動したり落としたりするのを自動化してもよかったのですが、この辺りで「もっと簡単に誰でも使えて安上がりな仕組みができないか」と考えてサービス化を検討し始めました。

解決したい課題

リモートビルドサービスで解決したい課題は次の通りです。

  1. ビルドを待つ間CPUを専有されてしまって他の作業ができない
  2. ビルド速度が遅い
  3. リモートビルドシステムの構築やメンテの手間がかかる
  4. 運用コストが高い

1と2はAndroidアプリケーション開発における課題で、3と4はリモートビルドシステムを自前で運用する場合の課題です。

今回作ったCyborg Buildは1,3を解決しています。2についてはリモートインスタンスのスペックアップで可能ですが、4の問題をサービス化で解決できるかどうかを先に検証しなければならないので直近のスコープには入っていません。

Cyborg-Build

1ヶ月ほどプロトタイピングしながらあれこれ試してある程度形になってきたので本日よりα版として公開します。ビルド時の体験が劇的に良くなると思うのでぜひ使ってみてください。

Cyborg Build

始め方はこちら

http://cyborg-build.com/getstarted

仕組み

サービスの仕組みは次の通りです。

Cyborg-BuildにGoogleアカウントでログインするとGoogle Cloud Storageのバケットをアカウントごとに払い出します。このバケットにソースコードをアップロードします。バケットにはログインしたアカウントとCyborg-Buildサービスのみがアクセスできます。

Cyborg-Build内でビルドコマンドを定義したプロジェクトを作成すると上図の操作をするスクリプトをダウンロードできます。ビルドスクリプトAndroidプロジェクトのルートに置いて実行するとバケットへソースコードをアップロードし、Cyborg-Buildに対してビルドリクエストを行います。Cyborg-Buildは対応するリクエストをリモートインスタンスで実行し、成果物をバケットにアップロードします。その後ビルドスクリプトはアップロードされた成果物をローカルにダウンロードします。オプションで起動アクティビティを設定すれば端末へのインストールと実行まで行えます。

機能

  • プロジェクトの作成
    • プロジェクトはパッケージ名と複数のタスクを持っています。
    • タスクは実行するgradleタスク回収する成果物のパス起動するアクティビティ名を設定できます
  • リモートビルドスクリプトのダウンロード
    • 作成したプロジェクトにもとづいてリモートビルドスクリプトを生成します
  • コマンドラインでのリモートビルドの実行

制限

α版なので最低限リモートビルドが体験できるところまでの機能となっています。次の項目はまだサポートしていませんが順次改善していきます。

  • 作成したプロジェクトの編集(かなり早期にやります)
  • イントラ内にあるmaven repositoryへのアクセス(未検討)
  • NDKの利用(おそらく動くとは思いますが...)
  • gradlewタスク以外のコマンド実行
  • テスト結果などの回収(動くかまだ試してない)
  • 各種メトリクスの表示などなど
  • IDEA Plugin化によるシームレスなリモートビルドの利用

α版で検証すること

色々とやりたい事はあるのですがα版では次の点に絞って取り組もうと思ってます。

  1. そもそもリモートビルドに価値があるのかを検証する
  2. 自己運用より安価にリモートビルドを提供ができるか
  3. 十分なマーケットサイズがあるか

資金周りが最初からクライマックスなので2については早期に検討して課金を開始したいところです。

フィードバックをください

個人的にはリモートビルドほんとに最高なのでぜひ皆さんに使っていただきたいです。そして色々とフィードバックを頂けると嬉しいです。

  • Twitter: @sys1yagi
    • おそらく一番反応が良いです。
  • Slack: invite link
    • 一応常駐しています。
  • ご意見フォーム(Cyborg Build)
    • トップの右下に設置しています。投稿は必ず読みます

サイトは英語ですがわりと適当なのでtypoや文法違うぞといったフィードバックももらえると嬉しいです。この構成だと動かない!みたいなケースもslackなどで相談して頂けると応対できると思います。

おわりに

個人のアプリはすでにCyborg-Buildを使って開発しています。会社ではリモートビルドシステムが構築済なのでそちらを使ってますが、コスト面でCyborg-Buildのほうが安いよねって感じにして移行できたらな〜とか思っています。とりあえず世界中のAndroidエンジニアのビルド体験を最高にできたらいいなと思っています。

*1:AWSではc3.2xlarge辺りを使っています