はじめに
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用」「開発用」の3種類あって、それを上記Env.hで切り替えるとします。
- 異なるBranchやRivisionを指定してビルドする必要がある(よくある)
方針
設定ミスに備えて、デフォルトではAppStore用の設定が生きるようにします
うっかり、テスト環境用の設定をリリースしたら大惨事です。
そこで、以下のようにしておきます。
- 異なるBundleIDでビルドする必要があるが、git本体にはAppStore版を記述しておく
- まあ、どちらにせよ AppStore用のバイナリを作る段階で判明しますが
- この部分のEnterprise用の書き換えは、jenkinsでビルドする直前に行う
-
Env.h
のようなファイルの内容も「本番用」(AppStore用)をデフォルトとします- 但し、開発時に本番環境に接続しても困るので、そこは
#if DEBUG
などで分けておきます - この部分のEnterprise用の書き換えは、Jenkinsでビルドする直前に行う
- 但し、開発時に本番環境に接続しても困るので、そこは
Env.hはこんな感じになります。
#ifdef DEBUG
// 「開発用の環境設定」
#else
// 「本番用の環境設定」
#endif
注意事項
Enterprise版は、JenkinsでEnv.h
を更新するので、開発者は環境設定を追加、変更した場合は、Jenkinsの設定も書き換える必要があることを覚えておいてください。
必要最低限に絞れば、それほど頻度は多くないはずです。
Jenkinsの設定
以下、Jobの設定です。
以前の投稿も参考にしてみてください。
http://qiita.com/mokemokechicken/items/5ea39c87512a515071f5
ビルドのパラメータ化で指定のRevisionをビルドするようにする
「ビルドのパラメータ化」を有効にして、「パラメータの追加」→「選択」を選びます
変数名REVISIONに ブランチ名やTAG名を記述しておきます
最初は、master
develop
とかその程度だと思いますが、随時更新して増やしていく感じです。
ソースコード管理の「Branch Specifier」に $REVISION と書きます
Enterprise用のファイルを書き換える
「ビルド手順の追加」をクリックし、「シェルの実行」を追加します。
もし追加した「シェルの実行」が「Xcode」のビルドより下にある場合は「Xcode」のビルドよりも前にくるようにドラッグします。
以下の様なスクリプトを書きます。 Env.h の部分は必要に応じて変更します。
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依存になります。
例えばこんな感じです。
- clean before build は、チェックしておいた方が安全だとは思います(ここではしていませんが)
- 「Xcode Workspace File」「Xcode Schema File」を指定してビルドする方が色々汎用的な気がします
- CocoaPodsなどを使う場合は、この2つで指定する必要があると思います(たぶん)
- SYMROOT は 、
Cannot remove *.ipa files from a non-existing directory
などでIPAの作成が失敗する場合指定してみると良いです
Enterprise版をWebからDownloadするのに必要なplist, html ファイルを作成する
XCodeビルドの後に「 シェルの実行 」を追加して、下記のようなスクリプトを貼り付けます。
PACKAGE_NAME, BUNDLE_IDENTIFIER, MASTER_JENKINS, LOGO_IMG_URL は適切に設定してください。
そして、上記のスクリプトの最後に
git reset --hard
と書いておきます(Env.h
やBundleID
など書き換えたものを戻しています)。
生成した ipa, plist, html ファイルを保存する
最後に、ビルド後の処理で「 成果物の保存 」を追加して、build/**/*.ipa,build/*.plist,build/*.html
と書いておきます。
おわりに
おおよそこんな感じの設定で、特に手作業など行わず、Enterprise版の作成ができるようになると思います。