Xcode5に組み込まれているCIの仕組み
ヤフー田村です。
Xcode5には、継続的インテグレーション(Continuous Integration:CI)の仕組みとして”Bot”という機能が組み込まれています。
Xcode5以前も、JenkinsなどでiOSアプリのCIを回すことはできましたが、Xcode5に組み込まれたことで、よりスムーズにCIを始めることができるようになりました。
この記事では、Botの紹介と簡単な導入手順、導入時に注意しておきたいパターンなどを紹介していきたいと思います。
Botの紹介
Botは OS X Serverの”Xcodeサービス”の上で動作し、1つのプロジェクトにつき1つのBotが生成されます。Botは”インテグレーション”という単位で動きます。このインテグレーションは、リポジトリからのチェックアウトからビルド、アナライズ、テスト、アーカイブを実施します。
このインテグレーション毎の結果はたまっていき、グラフで見ることができます。このインテグレーションの結果は、Webからのアクセスも可能ですが、Xcodeからのアクセスも可能です。そのため、Botを使っていないときと同じように、ビルドエラーやテストの失敗に大してソースの修正を行うことができます。
Botは実機でのユニットテストが可能です。これにより、実機に依存した部分をユニットテストでチェックすることができるようになりました。Androidほどではないにしても、機種とOSの組み合わせの量は増えてきています。これらの実機をOS X ServerにUSB接続して、全台にユニットテストを流すことができます。
Xcodeで見るBot
XcodeからBotを見るには、”Log Navigator”からロボットのアイコンをクリックします。
Xcodeで開発を行う開発者は、ここからどこに問題があったのかを確認できます。ビルドエラーやテストで失敗した箇所、アナライザでの警告等はソースへのリンクになっていて、直接そのファイルを開くことができます。Botを使わないで開発しているときとほぼ同じ感覚です。
実機でのテスト結果も、ここで確認することができます。
Webで見るBot
Xcodeから見た場合と、ほぼ同じ内容をWebで見ることができます。この画面は、Xcodeを使わない関係者が現状を把握するのに使えます。
Botでアーカイブを行っている場合は、手元のiPhoneにビルドされたバイナリをダウンロードすることができます。Xcodeを使わない関係者の持っているiPhoneにバイナリを入れるような場面にも、このWebが使えます。
WebからBotを見た場合、もう一つ「ビッグスクリーン」という見せ方があります。
Webで見るBot(ビッグスクリーン)
ビッグスクリーンは、動作しているすべてのBotのサマリーを表示します。この画面は自動で更新され、そのOS X Serverで動作しているすべてのBot全体の状況を、俯瞰することができます。関係者の目に付くところでこれを表示し、管制塔のように使うことができます。
Botの導入
それではBotを作る手順を、簡単に紹介していきます。
OS X Serverの導入
Botsは、OS X Serverの”Xcodeサービス”で動作します。そのためOS X Serverを購入する必要があります。 OS X ServerはAppStoreにて販売されており、通常のアプリケーションの購入と同じ手順でインストールすることができます。 OS X Serverを導入すると、アプリケーションの一覧に”Server”アプリケーションが追加されます。
ServerアプリケーションからXcodeサービスを設定
Serverアプリケーションから”Xcode”サービスを選択し、Xcodeサービスを設定します。最初はXcodeサービスは切になっているので、これを入にしておきます。
「設定」タブでは、以下を設定します。
- ビルド実行 : Botが使うXcodeを指定する
- 開発チーム : 実機でテストを行う場合には、ここでiDPアカウントを設定する必要があります。
- デバイス : 開発チームを設定して、そのiDPアカウントに登録されているiOSデバイスが接続されていると、ここにリストアップされます。実機でのユニットテストを実施する場合は、ここで実機を登録しておきます。
また、「リポジトリ」タブでは、Botがアクセスするリポジトリを追加します。github等を使っている場合、Botからのアクセスで使う公開鍵を、ここから取得することができます。認証を”SSHキー”にすると、SSHの設定が現れます。ここから公開鍵を取得し、リポジトリに登録しておきます。
開発MacのXcodeに、OS X Serverを追加
この設定は、開発で使うMac毎に設定が必要となります。 Xcodeの”Preferences”から”Account”を開き、下の+を押し、”Add Server”を選択します。 ここでXcodeサービスを動かしているOS X Serverを追加しておきます。
開発MacのXcodeからBotを追加
Botの作成
BotでCIさせたいプロジェクトをXcodeで開き、”Product”→”Create Bot”を選びます。ここでBotを作成します。いくつか選択が出てきますが、最初はデフォルトで進めるのが良いと思います。
Botの作成時に、いくつかの設定項目を入れていきます。これらの設定は、Bot作成後にも変更できます。
- Botが使うスキーマ、Bot名、Botの動作するServer
- リポジトリの登録がされていない場合は、リポジトリの登録
- スケジュール(毎日x時/コミットされたら/手動のみ)
- アクション(アナライズ、テスト、アーカイブ)
- テストを行う場合には、どのシミュレータ/実機を使うか
- 成功/失敗した時の通知設定
ここでは、Botが使うスキーマ、Bot名、Botが動作するサーバを設定します。
もしもスキーマが共有でない場合、スキーマの共有設定を行うチェックボックスが表示されます。スキーマの共有状態を確認するには、”Product”→”Scheme”→”Edit Scheme”を選択してEditScheme画面を開き、”shared”にチェックが入っているかで確認できます。
ここでは、Botが参照するリポジトリの認証を設定します。
もしもOS X ServerのXcodeサービスでリポジトリが登録されている場合は、この画面は出てきません。
ここではBotが参照するリポジトリの認証設定を行いますが、公開鍵でリポジトリにアクセスしている場合は、この画面だけでは設定できません。この場合、Botを作成した後、OS X ServerのXcodeサービスにてSSHキーの生成と公開鍵の取得を行い、リポジトリに登録する必要があります。
ここではインテグレーションのスケジュールの設定と、インテグレーションで実行するアクションを設定します。
ここではテストを実行するシミュレータや実機を設定します。
インテグレーションでテストを行わない場合、この画面は出てきません。
“All iOS Simulater”や”All iOS Devices”といった設定もできますし、どの実機/シミュレータでテストをするのかを選択することもできます。ただ、”All iOS Simulater”を選んでいると、1回のインテグレーションに時間がかかるようになるので、使うシミュレータを選択するのが良いと思います。
これらの設定はOS X Server側に保存され、プロジェクトにはどのサーバでBotが動作しているのか記録されます。この設定は、後からXcodeやWebから変更ができます。ですがリポジトリの認証設定、特に公開鍵認証については、OS X Serverの”Xcodeサービス”から詳細な設定を行う必要があります。
インテグレーションの実行とトラブルシュート
Botを作成すると、XcodeのLog Navigatorから、Botにアクセスできるようになります。Botのインテグレーションは設定したスケジュールに従って動作しますが、手動での実行ができます。手動でインテグレーションを実行するには、Log NavigatorにあるBotから”Integrate Now”を押します。
Botを作成した直後のインテグレーションは、様々なトラブルが発生します。自分が遭遇したパターンをいくつか紹介します。
プロジェクト設定を変更した後の、プッシュ忘れ
XcodeからBotを操作できるので、ローカルのgitにコミットしただけでインテグレーションを実行してしまいエラーが出る、というパターンを何度か繰り返すかもしれません。スキーマの共有設定が反映されない、テストを追加したのにそれがBotに出てこない、ProvisioningProfileを変更しても反映されない、等などはこのパターンが多いです。
Botは、リモートのリポジトリからファイルを取得し、動作します。一方Xcodeの一部のようにも見えるので、ローカルのXcodeで動作したら大丈夫だと感じがちです。Botの調子が悪いときには、変更点がリポジトリにプッシュされているかどうかの確認してみましょう。
自分はこのパターンが一番多かったです。
Botからリポジトリにアクセスする際にエラーが出る
プロジェクトをOS X Serverで管理している場合には発生しませんが、Githubなどのサービスや別サーバのgitでプロジェクトを管理している場合、認証が失敗することがあります。
OS X Serverの”Xcodeサービス”から取得した公開鍵をGithubに登録したのに、うまく動かないことがありました。この場合は”新しいSSHキーを生成”で新たな鍵を生成し、その公開鍵をリポジトリに登録することで認証に成功するようになります。
また、認証なしで公開リポジトリにアクセスするときにも、”/var/teamsserver/.ssh/がない”というエラーが発生する場合もあります。この場合は/var/teamsserver/.sshディレクトリを作成する必要があります。
実機でのテストを設定している場合は、
実機の「パスコードロック」を解除しておく
テスト対象に実機を登録している場合、パスコードロックを解除しておかないと、テストに失敗します。これはXcodeでデバッグ実行する場合と同じです。
最後に
最近CIが浸透してきて、iOSアプリ開発の現場でもCIの仕組みについてよく耳にするようになりました。特に「JenkinsでiOSアプリをビルドする方法」といった記事は、ブログなどで盛んに紹介されています。
BotはXcodeにビルドインされていて扱いやすく、また、実機でのテストが可能なのが強みです。その一方で、OS X Serverが必要であったり、Jenkinsのようなプラグインによる拡張ができないなどの弱みもあります。
iOSアプリのCIを始めるときには、これらの仕組みをいろいろと試し、選んでいくのが良いのではないかと思います。
参考URL
Xcode5の新機能 Xcode Continuous Integration Guide
Yahoo! JAPAN Tech BlogではiOS 7勉強会に関する様々な資料を公開しています。ぜひご覧ください。
CodeIQコード銀行にあなたのコードを預けてみませんか?
- CodeIQコード銀行ではあなたのコードを財産と考えます。
- お預かりいただいたコードは、CodeIQコード銀行がしっかり評価し、フィードバックいたします。
- 当コード銀行にお預けいただいたコードは、企業がみてスカウトをかける可能性があります。
- 転職したい方や将来転職することを考えている方で、今の自分のスキルレベルを知りたい方はぜひ挑戦してみてください。
- 企業からスカウトがきたら困る人は挑戦しないでください。
興味を持った方はこちらからチャレンジを!
締切は3月31日(月)AM8:00までです。
ヤフー株式会社に勤務。地域系サービスで主にiOSアプリ開発に従事。
近くのお店を写真で選べるアプリ「LocoClip」の開発を行う。
twitter: @paming