jenkinsでXcode(+cocoapods)向けのビルド環境を構築する(無理矢理な方法)

jenkinsをXcode向けにビルド環境を構築するやり方がいくつかブログにありますが、workspace向けの記事があまりありません。正確には、CocoaPodsを活用したjenkinsのビルド構築の方法が、ですが。

必要に迫られて構築してみたら、微妙にハマったのでやり方をメモしておきます。

基本的な流れとしては、以下の通りです。

  1. CocoaPodsで依存関係をインストール
  2. Xcodeを起動する
  3. Xcode Pluginでビルド実行してIPAファイル化
  4. Xcodeを閉じる
  5. sshプラグインなどで、生成されたIPAファイルをOTA環境にupload

# 但し、5は今回省きます

Xcodeを起動する必要性に関して

CocoaPodsを用いてプロジェクトを構築している場合、workspaceフォルダを起動するまでschemeの設定が書き込まれません。 *.workspaceCocoaPods によって生成される2次ファイルのため、コミットしたくありません。そのため、 pod instlal 後に一旦Xcodeを起動してworkspaceファイルを更新する必要があります。

# 起動時のシーケンスをエミュレートしようとしたんですが、変数色々あって実は楽な方へ逃げました(汗。

なお、Xcodeを起動していない状態で、podによって生成されたworkspace領域に対して試しに xcodebuild -list するとこんな感じに言われます。

$ cd sample
$ xcodebuild -list

Information about project "sample":
    Targets:
        sample

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Release" is used.

    This project contains no schemes.

ビルド構成

ビルドの方法を以下に記述します。 既にjenkins(およびxcodeプラグイン)のインストールと起動は済んでいると前提とします。

0. バージョン対象外ファイル

プロジェクトルートの * Pods/ * Podfile.lock * <<application>>.xcworkspace は先ほども述べたようにPodsによって生成される2次ファイルのため、バージョン管理対象としません。

1. CocoaPodsによる依存関係のクリーンインストール

Pods / Podfile.lock / <<application>>.workspaceCocoaPods で生成を行います。

$ cd sample
$ pod install
# 上記の理由によりXcodeを一度起動させる必要がある
$ pod install

2. Xcodeの起動

アプリケーションを起動して、xcworkspaceの設定を反映させます。

# (但しXcodeが起動していると手動でXcodeの再読み込みを行うかのチェックが走るので、いったん強制的にXcodeをを落とす)
$ pgrep -f "/Applications/Xcode.app" | xargs kill
$ open sample.xcworkspace
$ sleep 5

2. Xcodeビルドの実行

基本的にはProject指定と同じですが xcodebuild の以下の書式に従うように設定をいじります。

xcodebuild -workspace <workspacename> -scheme <schemeName> [-configuration <configurationname>] [-arch <architecture>]... [-sdk [<sdkname>|<sdkpath>]] [-showBuildSettings] [<buildsetting>=<value>]... [<buildaction>]...

Jenkins上のxcodeのビルド設定のうち Xcode Schema FileXcode Workspace FileXcode Project Directory 辺りの設定が必要になると思います。

1. Xcodeを終了

Xcodeを終了します。

$ pgrep -f "/Applications/Xcode.app" | xargs kill

これでCocoaPodsで構築しているXcodeプロジェクトをJenkinsでも行うことが可能です(とても微妙ーな方法ですが...。)

以上です。