iOS開発+Mac+JenkinsでCI環境構築2-Gitコミット時に自動的にTestflight配信

jenkinstestflight

CI環境導入のために、Jenkinsを導入しています。最終的には、テストコードをたくさん記述して、コミットごとにテストを行うようにしようと思っているのですが、まず、gitの特定のブランチに新しくpushされたら、その情報をテストメンバーにtestflightで送ることを行いました。

要件はこちら

  1. ビルド成功時にtestflightを送信
  2. testflightのコメントに、ブランチのcomitのメッセージをのせる

という比較的単純に思えるものです。これを実現するのが意外と大変でした。もし、もっと簡単にできるよという方法をご存知の方はコメントかtwitterで教えてください。
iOS開発+Mac+JenkinsでCI環境構築1-Jenkinsでビルドが通るまで | Zero4Racer PRO Developer’s Blog こちらの投稿の続きですので、あわせてご覧ください。

  • gitの特定のブランチへのpush時にビルドを発生させる

  • こちらは、ビルドのジョブで、gitを指定する際に、ブランチを指定します。この画像では、masterを指定しています。

  • TestFlightのジョブを作成

  • Parameterized Trigger Plugin – Jenkins – Jenkins Wiki と、Testflight Plugin – Jenkins – Jenkins Wiki こちらの2つのプラグインを、GUIの、Manage Pluginからさがしてインストール、再起動します。
    ビルドジョブに加えて、新規の、testflightアップロード用のJobを作成します。TestFlight用のジョブには、以下の情報を設定します。

    1. Post-Build ActionにUpload to TestFlightを追加
    2. API Tokenを、TestFlightから取得
    3. TestFlightの、自分のProfileから見つけることが出来ます。

    4. Team TokenをTestFlightから取得
    5. TestFlightの”Team Info”タブから見つけることが出来ます。

    6. IPAファイルの設定
    7. これは、Buildを行うジョブで、ipaを作成するにチェックをしていると、常に同じ名前でファイルが作成されるので(バージョンがかわったらこれが変わるのが現状の問題)それをフルパスで指定

    8. dSYMファイルの設定
    9. これは、Buildを行うジョブで、ipaを作成するにチェックをしていると、常に同じ名前でファイルが作成されるので(バージョンがかわったらこれが変わるのが現状の問題)それをフルパスで指定”C_POS-Release-1.0-dSYM.zip”のような、zipファイルを指定。

    10. Build Notesの指定
    11. とりあえず、$GITLOGと指定しておく。後で述べる指定をしないと、ちゃんと表示されない

    12. Distribution Lists
    13. これは、TestFlight側で、配信したいメンバーを選択して、Distribution Listを作成しておく。複数指定も可能。

    このように、TestFlightアップロード用の別ジョブを作成しておきます。

  • ビルドジョブと、TestFlightジョブの接続

  • ビルドジョブ側に、”Trigger/Call builds on other projects”というビルドステップを追加。対象のジョブに、testflight用のジョブを指定する。これによって、ビルドが成功したときにtestflight用のjobが呼び出される。

  • 一意のビルド番号が設定されるように、xcodeのプロジェクトを設定

  • 上記の設定で正しく動きそうなのですが、私の環境で、正しく動かなくて、困りました。testflightのリンクが出来て、ジョブは成功しているのに、ビルドが正しくtestflightにアップロードされていないという状況です。調べてみると、これを回避するために、xcode側のビルド番号を毎回変更してあげる必要があります。そのために、xcodeのプロジェクトに次のような変更をしました。

    ビルド番号を一意にする
    ビルド番号を一意にする

    1. ターゲットのビルド設定の、build phasesにAdd Build Phaseでrun scriptビルドフェイズを追加
    2. ビルド番号のインクリメントのスクリプトを書く
    3. 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

    4. Summaryタブで、Build部分に、数字を入れる
    5. 初期値は、0でも、100でも問題ないと思います。

    この設定を行うことにより、testflight側が、新しいビルドであると理解して、毎回正しくビルドが送信されるようになりました。

  • gitのコメントをtestflightに反映

  • これが思った以上に面倒でした。svn – Get access to Build Changelog in Jenkins – Stack Overflow を参考にして、以下の段階を踏んでいいます。

    1. ビルドのジョブの中で、changelog.xmlをjava property形式のテキストファイルに書き出す
    2. testflightアップロードジョブの中で、java property形式のファイルを読み込んで環境変数に追加
    3. testflightのbuild noteで、環境変数を読み込み

    詳しく見てみましょう。

    1. ビルドのジョブの中で、changelog.xmlをjava property形式のテキストファイルに書き出す
    2. これを行うために、2つのファイルを作成しました。
      まず、changelog.xmlを、java property形式に書き出すもの。単純に、ファイルを
      GITLOG = ファイルの内容
      に書き換えるだけなのですが、改行を、 “\n\”という文字列に書き換えることによって、プロパティ形式にしています。

      perlで置換をする、置換文字列の中に、”\\”が入っているとエラーになったので、置換のためのperlスクリプトを作成してい呼び出しています。

      そしてビルドのジョブの、”Trigger/Call builds on other projects”の前に、”Excute shell”ビルドステップを追加して、そこに、このように書き込みます。


      これで、Testflightジョブのフォルダに、最新のコミットログが、javaのプロパティ形式で保存されます。

    3. testflightアップロードジョブの中で、java property形式のファイルを読み込んで環境変数に追加
    4. 作成したテキストを、アップロードのジョブから呼び出すためには、EnvInject Plugin – Jenkins – Jenkins Wiki をプラグインのUIからインストール、再起動します。
      TestFlightのジョブで、Build Envionmentを設定。作成したプロパティファイルを設定します。

      これで、プロパティファイルで設定した、GITLOG環境変数が読み込まれます。

    5. testflightのbuild noteで、環境変数を読み込み
    6. これは、先ほど設定したのと同じで、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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください