CI環境導入のために、Jenkinsを導入しています。最終的には、テストコードをたくさん記述して、コミットごとにテストを行うようにしようと思っているのですが、まず、gitの特定のブランチに新しくpushされたら、その情報をテストメンバーにtestflightで送ることを行いました。
要件はこちら
- ビルド成功時にtestflightを送信
- testflightのコメントに、ブランチのcomitのメッセージをのせる
という比較的単純に思えるものです。これを実現するのが意外と大変でした。もし、もっと簡単にできるよという方法をご存知の方はコメントかtwitterで教えてください。
iOS開発+Mac+JenkinsでCI環境構築1-Jenkinsでビルドが通るまで | Zero4Racer PRO Developer’s Blog こちらの投稿の続きですので、あわせてご覧ください。
-
gitの特定のブランチへのpush時にビルドを発生させる
-
TestFlightのジョブを作成
- Post-Build ActionにUpload to TestFlightを追加
- API Tokenを、TestFlightから取得
- Team TokenをTestFlightから取得
- IPAファイルの設定
- dSYMファイルの設定
- Build Notesの指定
- Distribution Lists
-
ビルドジョブと、TestFlightジョブの接続
-
一意のビルド番号が設定されるように、xcodeのプロジェクトを設定
- ターゲットのビルド設定の、build phasesにAdd Build Phaseでrun scriptビルドフェイズを追加
- ビルド番号のインクリメントのスクリプトを書く
- Summaryタブで、Build部分に、数字を入れる
-
gitのコメントをtestflightに反映
- ビルドのジョブの中で、changelog.xmlをjava property形式のテキストファイルに書き出す
- testflightアップロードジョブの中で、java property形式のファイルを読み込んで環境変数に追加
- testflightのbuild noteで、環境変数を読み込み
- ビルドのジョブの中で、changelog.xmlをjava property形式のテキストファイルに書き出す
- testflightアップロードジョブの中で、java property形式のファイルを読み込んで環境変数に追加
- testflightのbuild noteで、環境変数を読み込み
こちらは、ビルドのジョブで、gitを指定する際に、ブランチを指定します。この画像では、masterを指定しています。
Parameterized Trigger Plugin – Jenkins – Jenkins Wiki と、Testflight Plugin – Jenkins – Jenkins Wiki こちらの2つのプラグインを、GUIの、Manage Pluginからさがしてインストール、再起動します。
ビルドジョブに加えて、新規の、testflightアップロード用のJobを作成します。TestFlight用のジョブには、以下の情報を設定します。
TestFlightの、自分のProfileから見つけることが出来ます。
TestFlightの”Team Info”タブから見つけることが出来ます。
これは、Buildを行うジョブで、ipaを作成するにチェックをしていると、常に同じ名前でファイルが作成されるので(バージョンがかわったらこれが変わるのが現状の問題)それをフルパスで指定
これは、Buildを行うジョブで、ipaを作成するにチェックをしていると、常に同じ名前でファイルが作成されるので(バージョンがかわったらこれが変わるのが現状の問題)それをフルパスで指定”C_POS-Release-1.0-dSYM.zip”のような、zipファイルを指定。
とりあえず、$GITLOGと指定しておく。後で述べる指定をしないと、ちゃんと表示されない
これは、TestFlight側で、配信したいメンバーを選択して、Distribution Listを作成しておく。複数指定も可能。
このように、TestFlightアップロード用の別ジョブを作成しておきます。
ビルドジョブ側に、”Trigger/Call builds on other projects”というビルドステップを追加。対象のジョブに、testflight用のジョブを指定する。これによって、ビルドが成功したときにtestflight用のjobが呼び出される。
上記の設定で正しく動きそうなのですが、私の環境で、正しく動かなくて、困りました。testflightのリンクが出来て、ジョブは成功しているのに、ビルドが正しくtestflightにアップロードされていないという状況です。調べてみると、これを回避するために、xcode側のビルド番号を毎回変更してあげる必要があります。そのために、xcodeのプロジェクトに次のような変更をしました。
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" ${PROJECT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}-Info.plist)
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" ${PROJECT_DIR}/${PROJECT_NAME}/${PROJECT_NAME}-Info.plist
初期値は、0でも、100でも問題ないと思います。
この設定を行うことにより、testflight側が、新しいビルドであると理解して、毎回正しくビルドが送信されるようになりました。
これが思った以上に面倒でした。svn – Get access to Build Changelog in Jenkins – Stack Overflow を参考にして、以下の段階を踏んでいいます。
詳しく見てみましょう。
これを行うために、2つのファイルを作成しました。
まず、changelog.xmlを、java property形式に書き出すもの。単純に、ファイルを
GITLOG = ファイルの内容
に書き換えるだけなのですが、改行を、 “\n\”という文字列に書き換えることによって、プロパティ形式にしています。
perlで置換をする、置換文字列の中に、”\\”が入っているとエラーになったので、置換のためのperlスクリプトを作成してい呼び出しています。
そしてビルドのジョブの、”Trigger/Call builds on other projects”の前に、”Excute shell”ビルドステップを追加して、そこに、このように書き込みます。
これで、Testflightジョブのフォルダに、最新のコミットログが、javaのプロパティ形式で保存されます。
作成したテキストを、アップロードのジョブから呼び出すためには、EnvInject Plugin – Jenkins – Jenkins Wiki をプラグインのUIからインストール、再起動します。
TestFlightのジョブで、Build Envionmentを設定。作成したプロパティファイルを設定します。
これで、プロパティファイルで設定した、GITLOG環境変数が読み込まれます。
これは、先ほど設定したのと同じで、testflight uploadのBuild Notesに、$GITLOGと書き込むだけです。
これで、TestFlightのBuild Notesに、コミットログが追加できるようになりました。
このように、Jenkinsはシェルでいろいろごにょごにょできるため、コマンドライン派には非常に簡単にいろいろ出来ますが、GUIのゆとりプログラマには結構大変。でもいろいろ勉強になっています。正しく動くと感動が大きいですね。
これで、testflightが出来たので、testケースをどんどん書いてテストに導入していきたいと思います。
iOS開発+Mac+JenkinsでCI環境構築3-GitHubにあるJenkinsのプラグインを試してみる | Zero4Racer PRO Developer’s Blog に続きを書きました。
参考サイト:
Auto Increment Build Number in Xcode 4.2 (fixed) | Wojtek ‘suda’ Siudzinski – Blog
Xcodeでbuild番号を自動で増やす方法
Ups and Downs with Continuous Integration for iOS Apps (Jenkins, Xcode, Cobertura and Testflight) « EclipseSource Blog