AppStore向けiOSアプリをJenkinsでEnterprise配布するときのTips


はじめに
=======
AppStore向けiOSアプリをテストやお客様に確認して頂く目的で、Enterprise配布版を作成することがあると思います。
その際の色々な手間や手作業ミスの混入を防ぐためにJenkinsを使う際のTipsです。


主な前提
====

前準備
-------
* ソースコードはgitで管理されている
* Jenkinsは設置済みで、 以下のPluginをInstallしておく
	* XCode Plugin: https://wiki.jenkins-ci.org/display/JENKINS/Xcode+Plugin
	* Git Plugin: https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
	* Node and Label parameter plugin: https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin
* Enterprise配布用のProvisioningも取得済み
* Build用のMacにProvisiningファイルは取り込み済みで、Jenkins (Master|Slave)もInstall済み

AppStore用のアプリをEnterprise配布版にするときの作業
------------------
今回はよくやりそうな以下の作業をやることを想定して話をすすめます。

* AppのBundleID を変更する（必須）
* 接続先サーバのURLやTwitterのURLなど複数の定義項目を変更する(よくある)
	* それらの設定は一つの `Env.h` ファイルにまとめてある
* 環境は「本番用」「Enterprise用」「開発用」の３種類あって、それを上記Env.hで切り替えるとします。
* 異なるBranchやRivisionを指定してビルドする必要がある（よくある）

方針
------

### 設定ミスに備えて、デフォルトではAppStore用の設定が生きるようにします
うっかり、テスト環境用の設定をリリースしたら大惨事です。
そこで、以下のようにしておきます。

* 異なるBundleIDでビルドする必要があるが、git本体にはAppStore版を記述しておく
	* まあ、どちらにせよ AppStore用のバイナリを作る段階で判明しますが
	* この部分のEnterprise用の書き換えは、jenkinsでビルドする直前に行う
* `Env.h`のようなファイルの内容も「本番用」（AppStore用）をデフォルトとします
	* 但し、開発時に本番環境に接続しても困るので、そこは `#if DEBUG` などで分けておきます
	* この部分のEnterprise用の書き換えは、Jenkinsでビルドする直前に行う

Env.hはこんな感じになります。

```cpp:Env.h
#ifdef DEBUG
//	「開発用の環境設定」
#else
//	「本番用の環境設定」
#endif
```

注意事項
----------

Enterprise版は、Jenkinsで`Env.h`を更新するので、開発者は環境設定を追加、変更した場合は、Jenkinsの設定も書き換える必要があることを覚えておいてください。
必要最低限に絞れば、それほど頻度は多くないはずです。

Jenkinsの設定
====

以下、Jobの設定です。
以前の投稿も参考にしてみてください。
http://qiita.com/mokemokechicken/items/5ea39c87512a515071f5


ビルドのパラメータ化で指定のRevisionをビルドするようにする
--------------------------

###「ビルドのパラメータ化」を有効にして、「パラメータの追加」→「選択」を選びます

![kobito.1385018028.773555.png](https://qiita-image-store.s3.amazonaws.com/0/11124/38b5abfa-4291-a435-ceac-16ff0e554f20.png "kobito.1385018028.773555.png")

### 変数名REVISIONに ブランチ名やTAG名を記述しておきます

最初は、`master` `develop` とかその程度だと思いますが、随時更新して増やしていく感じです。

![kobito.1385017889.731882.png](https://qiita-image-store.s3.amazonaws.com/0/11124/2674dc57-8091-99d8-d4bc-9151a644d819.png "kobito.1385017889.731882.png")

### ソースコード管理の「Branch Specifier」に $REVISION と書きます

![kobito.1385018499.774444.png](https://qiita-image-store.s3.amazonaws.com/0/11124/0314cdf3-3925-8c06-2d73-d0d909f06705.png "kobito.1385018499.774444.png")

Enterprise用のファイルを書き換える
----------------------------------------

「ビルド手順の追加」をクリックし、「シェルの実行」を追加します。
もし追加した「シェルの実行」が「Xcode」のビルドより下にある場合は「Xcode」のビルドよりも前にくるようにドラッグします。

以下の様なスクリプトを書きます。 Env.h の部分は必要に応じて変更します。

```sh
APP_INFO_PLIST=PATH/TO/myapp-Info.plist
APPSTORE_BUNDLE_ID=com.example.appstore.myapp
ENTERPRISE_BUNDLE_ID=com.example.enterprise.myapp
ENV_H_PATH=PATH/TO/Env.h

# Bundle IDの書き換え
perl -p -i -e "s|<string>${APPSTORE_BUNDLE_ID}</string>|<string>${ENTERPRISE_BUNDLE_ID}</string>|" $APP_INFO_PLIST

# Env.h の書き込み
cat <<EOF >$ENV_H_PATH
#ifndef myapp_Env_h
#define myapp_Env_h

#define API_HOST @"http://ent.myapp.example.com"
#define API_PATH @"/api/500/"

#define TWITTER_SHARER_URL @"http://twitter.com/intent/tweet?hashtags=myapp&text="

#endif
EOF
```

わりとこんな感じにやんちゃに書き換えても大丈夫です。

### これに起因する問題と対処
ここを変更すると、Localで変更があるため、次回の`git clone`で失敗する可能性があります。
従って、このJobの終わり頃に、`git reset --hard`しておく方が安全です(後述します）。
もし、それでもエラーが出て治らない場合は、「ワークスペースのクリア」をすると良いです。


XCodeビルドの設定をする
------------------------------------

ここは完全にそのProject依存になります。
例えばこんな感じです。
![kobito.1385019900.468401.png](https://qiita-image-store.s3.amazonaws.com/0/11124/16acc1ee-b69a-81d5-76f7-13f9b9507284.png "kobito.1385019900.468401.png")

* clean before build は、チェックしておいた方が安全だとは思います（ここではしていませんが）
* 「Xcode Workspace File」「Xcode Schema File」を指定してビルドする方が色々汎用的な気がします
	* CocoaPodsなどを使う場合は、この２つで指定する必要があると思います（たぶん）
* SYMROOT は 、`Cannot remove *.ipa files from a non-existing directory` などでIPAの作成が失敗する場合指定してみると良いです
	* [参考](http://stackoverflow.com/questions/10738624/trying-to-compile-an-xcode-project-with-a-workspace-on-jenkins-slave)

Enterprise版をWebからDownloadするのに必要なplist, html ファイルを作成する
-----------------------

XCodeビルドの後に「 シェルの実行 」を追加して、下記のようなスクリプトを貼り付けます。

https://gist.github.com/mokemokechicken/6363430

PACKAGE_NAME, BUNDLE_IDENTIFIER, MASTER_JENKINS, LOGO_IMG_URL は適切に設定してください。

そして、上記のスクリプトの最後に

```
git reset --hard
```

と書いておきます（`Env.h`や`BundleID`など書き換えたものを戻しています)。


生成した ipa, plist, html ファイルを保存する
---------------------

最後に、ビルド後の処理で「 成果物の保存 」を追加して、`build/**/*.ipa,build/*.plist,build/*.html` と書いておきます。

![kobito.1385020475.906307.png](https://qiita-image-store.s3.amazonaws.com/0/11124/27d85801-d36b-c910-1c9b-7d4169d5285e.png "kobito.1385020475.906307.png")



おわりに
======

おおよそこんな感じの設定で、特に手作業など行わず、Enterprise版の作成ができるようになると思います。