jarinosuke blog

about software engineering, mostly about iOS

iOS開発における現実的なCI環境

継続的インテグレーション

f:id:jarinosuke0808:20120409205359j:image
最近では iOS アプリでも単体テストを使った継続的インテグレーションが注目されています。
iOS 開発の単体テストについては、このブログでも取り扱いました。
Xcode 4 からはじめる Unit Testing
GHUnitとOCMockでUnit Test効率化
一般的な CI 環境についての説明は、以下の本から抜粋するとこんな感じです。

Jenkins

Jenkins

デプロイメントに至るまでの開発プロセスをスムーズにし、バグの検出とフィックスを素早く行えるようにし…(略)

では iOS 開発における現実的な CI 環境を考えていきましょう。

理想

CI 環境を構築するにはそれなりのコストが必要になります。
例えばビルド機を考えると xcodebuild (iOS アプリをビルドする時に実行されるコマンドラインツール)が動く Mac OS マシンが必要になります。
もちろんコードを書いていて手元にある Mac OS マシンでも可能ですが、ジョブが常に走っているかもしれないマシンで快適な開発が行えるかというと疑問が残ります。
他にも CI 環境がビルドするためのコードを管理する VCS リポジトリの選定も考えないといけません。
GitHub などのホスティングサービスを使うのが手っ取り早いですが、App Store に公開することも考えて非公開のリポジトリを使いたい場合もあります。
でも有料は嫌だし、外部サービスにコードをコミットしたくないという考え方もあります。

このように考えていくと、プロジェクトや人によって求めている環境に差があることが分かりました(当たり前)。
ということで、僕が CI 環境を構築する上で優先した事柄を並べて実際にどのような環境になったか説明させて下さい。

現実

まず優先した事柄はこんな感じです。

  1. ソースコードは外に出さない。
  2. ローカルの開発に影響が出ないようにする。
  • 使ってない MacBook Pro を有効活用したい。
  • でも自分でドメイン取ってホスティングとかはしたくない。
  • できれば OTA を使ってテストユーザーに自動でアプリを届ける。

これらを考慮して、実際に構築した環境のお絵描きがこの記事の上にある画像です。
一つ一つ簡単に見ていきます。

  • ビルド機(CI サーバ)

使っていない MacBook Pro を CI サーバにして有効活用しました。
もちろん CI サーバとしては Jenkins を使いました。

ソースコードを外に出したくなかったため、 Dropbox 上に Git リポジトリを立てて運用しました。
Dropbox を用いることで Git リポジトリが常に CI サーバと各開発機で同期され、常にフレッシュなリポジトリとして実質ホスティングサービスと同様な機能を提供可能です。

  • デプロイ方法

開発中のアプリケーションをなるべく多くの人に使ってもらいフィードバックを得たいですね。
iOS 開発では AdHoc Distribution という機能があり App Store を介さず、また USB で対象デバイスを繋がずともアプリケーションをインストールすることが可能です。
iOS Developer Program 3.Distribute
ですが、対象デバイスの UDID を聞いたり調べたり、配布用の ipa ファイルと plist ファイルをホスティングする環境も用意しないといけません。結構な手間です。
そこで僕は TestFlight という iOS App の Beta Disribution を手助けしてくれるサービスを選びました。これによってスゴい簡単にアプリケーションの配布が楽になりました。
TestFlight About
また、 Jenkins にプラグインが存在するため CI が通ったらテストユーザーに配布する、といったジョブも設定できるようになっています。
Jenkins Testflight Plugin

終わりに

実際に構築する方法などについてはこの記事にまとめてしまうと、とても長くなってしまうので避けますがもし要望などがあれば書きたいと思います。
このように Xcode 4 で Unit Testing がアプリケーションのテンプレート設定に追加され、開発手法として継続的インテグレーションに注目が集まっています。
そんな流れに乗って、遂にこんな本も出るみたいです。

Test-Driven iOS Development (Developer's Library)

Test-Driven iOS Development (Developer's Library)


すぐセットアップできるとは限らない CI 環境ですが、構築するだけでも考え方など勉強になる点がたくさんあると思うのでオススメです。