すでに稼働しているJenkinsサーバがあり、このサーバがMacではない場合や、何らかの理由によってXcodeがインストールできない場合のiOSアプリビルドの方法を紹介します。グリーで利用しているJenkinsマスタサーバもLinuxで管理していて、このケースに該当します。iOSアプリビルドにはMacが必要です、このためMacをJenkinsのビルドスレーブとして構築し、そのMacにXcodeや開発者証明書などをインストールしてアプリをビルドします。
iOSビルドをするJenkinsスレーブはMac ProやMac miniなど専門のマシンとして準備できると理想的ですが、なかなか準備が難しい場合はMacBook Proなどのラップトップをスレーブにする方法もあります。Jenkinsスレーブはネットワークの状態を見てJenkinsマスタに接続可能になれば自動接続してくれますので、ラップトップを持ち運んだりしてネットワーク構成が変わる場合でも比較的柔軟に運用できます。
Jenkinsスレーブを作成するには、メニュー[Jenkinsの管理]から[ノードの管理]を選び、[新規ノードの作成]を選びます。スレーブはダムスレーブとして作成します。ここでは、[ノード名]を「mac」としてスレーブを作成しました。
同時ビルド数、リモートFSルートが必須入力項目ですので、これらを入力します。リモートFSルートはこのスレーブが利用する作業ディレクトリです。スレーブを実行するユーザーの書き込み権限のあるディレクトリを指定してください。また、図ではラベルを指定しています。
ラベルはジョブを実行する際にどのスレーブで実行するかを識別するために利用する管理上の名前で、自由に付けられますが、図のように「mac_xcode46」(Xcode 4.6がインストールされたMacのスレーブ)のようなラベルを付けると複数のMacが共存する場合、複数バージョンのXcodeを共存させたい場合などに便利です。
特に、iOS開発では新iOSバージョンがリリースされXcodeなどの開発環境が新しいバージョンへ移行するタイミングで問題が起こりがちで古い環境を残しておいた方が便利な場合があります。手元に複数台のMacがあれば1つ前のXcode開発環境を残しておきJenkinsのスレーブとして設定しておけば、より安心して開発できるでしょう。
スレーブの作成が終わったら、プロジェクトの設定を変更します。プロジェクトの設定で、[実行するノードを制限]という項目がありますので、ここに設定したスレーブのラベルを設定してください。これで、iOSアプリ開発のジョブはMac上のスレーブのみで実行されるようになります。
iOSアプリをパッケージングする際には開発者の証明書を使ってパッケージに署名が必要です。証明書はKeychainサービスでパスワードによって保護されています。Jenkinsがアプリに署名をするにはJenkinsスレーブがKeychainサービスに認証済みか、KeychainのパスワードをJenkinsに設定済みである必要があります。
JenkinsスレーブがKeychainサービスに認証済みであるかどうかは、Jenkinsスレーブ起動方法に影響します。Jenkinsスレーブを起動する時点で、Keychainサービスに認証済みであれば、それらの設定を引き継ぎますので特別な設定は不要です。
何らかの事情でJenkinsスレーブがKeychainサービスに認証済みの状態で起動できない場合には、Xcode IntegrationプラグインではKeychainを設定したパスワードでアンロックしてからパッケージに署名をするようなオプションがありますので、これを使うと良いでしょう。
本連載では詳しく説明しませんが、iOSデバイス上でのテスト向けに「Testflight」プラグインや、「iOS Device Connector」プラグインなどビルドからテストまでの手続きの多くを自動化するためのプラグインも提供されています。「Clang Scan Build」プラグインは「Clang」の強力な静的コード解析ツールを使ってプロジェクトのソースコードを解析し、問題をレポートしてくれるようなツールもあります。
今回紹介したようなiOSアプリのビルドを自動化するだけでも、チーム開発においては大きく開発効率が変わります。この次のステップとして単体テストや、Testflightなどを用いたビルド配布の自動化、ソースコードの静的解析などを用いた指数のトラックなど自動化できることはさまざまです。
漠然と「面倒くさいな」と感じていた作業があれば少しずつJenkinsを使って自動化を進めてみてください。小さな作業でもコツコツ自動化していけば、開発チームにとっての大きな資産となるでしょう。
Copyright © ITmedia, Inc. All Rights Reserved.