iOSのプロジェクトをJenkinsでビルドする

情報がまとまっていなくて苦労したので書いておく。やってしまえば簡単。

やりたいこと

  • githubにpushした時点でビルドする
  • ビルドしてテストを実行する(まだできてない)
  • ビルドして、Testflightを使って、弊社のセールス・サポートチームに配布する
  • Provisioningを更新するなどの作業はJenkinsを意識しなくてもできること
  • Provisioningはgitのリポジトリに入れておく

やらないこと

  • 自動でベータ版としてベータテスターに配布する
  • 自動でiTunes Connectにサブミットする

Jenkinsをインストールする

Mac用のパッケージをインストールする。インストーラdaemonとかいうユーザーで実行しようとするが、これはjenkinsとか適当に作ったユーザーに変えておく。

証明書をインストールする

Distribution用の証明書と鍵をインストールしておく。インストールするキーチェーンを「ログイン」ではなく、「システム」にしてしまうと、キーチェーンのアンロックを考えずにすむので楽。

あ、もしかしたら「キーチェーン使っても良いん??」って聞かれるような気がするので、あらかじめ下のxcodebuildを一回実行しておくと良いのかも。常に許可するように設定すれば良い。

ビルドする

xcodebuildコマンドを使う。こんな感じ。

$ cd ${WORKSPACE}
$ rm -f /Users/jenkins/Library/MobileDevice/Provisioning\ Profiles/*
$ cp *.mobileprovision /Users/jenkins/Library/MobileDevice/Provisioning\ Profiles/
$ rm -rf build
$ xcodebuild -project Ubiregi2.xcodeproj/ -target Ubiregi2 -configuration Release CODE_SIGN_IDENTITY="iPhone Distribution: Ubiregi Inc." build

最初のほうのrmとcpがちょっとポイント。プロビジョニングファイルはXcodeに登録しておく必要があるが、gitリポジトリ経由で更新したいので、あらかじめ登録しておくのは良くない。そこで、Xcodeがプロビジョニングプロファイルを探すディレクトリに、直接コピーする戦略を取る。

rmで空にするのは、確実にgitリポジトリ経由でコピーしたプロビジョニングプロファイルを使用させるため。

あとはコピーすれば更新される。

IPAにパッケージする

xcrunコマンドを使う。

$ xcrun -sdk iphoneos PackageApplication --embed TestFlight_Ubiregi.mobileprovision build/Release-iphoneos/Ubiregi2.app -o ${WORKSPACE}/build/Ubiregi2.ipa

--embedを使って、プロビジョニングプロファイルを埋め込まないと、TestFlightできない。さらに、TestFlightするためには、ビルドのときに使ったプロファイルを同じものをembedしないといけない。

このときに--signし直す方法もあるみたいだけど、なんか上手くいかなかった。とりあえずこれで動いてるから良いことにしている。

TestFlightに送信する

適当にcurlを使って送信する。

$ curl http://testflightapp.com/api/builds.json -F file=@${WORKSPACE}/build/Ubiregi2.ipa -F api_token=...... -F team_token=...... -F notes="`git log -5`" -F notify=true -F distribution_lists=Ubiregists

これは社内のスタッフに送るためのナイトリービルドなので、リリースノートは適当で良い。