Xcode5でcocoapodsを入れつつJenkinsでCI環境を作りつつXCTestが動くようにするまで

最近は、html、js、cssまわりをやっていたので、Objective-Cの案件に関わるのがすごく久しぶり。

cocoapodsはそろそろ当たり前っぽくなったのかな。

テストはXCTestというFrameworkになったことは、twitterとかでなんとなく見ていたので、その辺りを試してみる。

出来上がりはこちら mpon/JenkinsSample · GitHub

cocoapodsの導入

  • rbenvで専用のrubyをinstallしてcocoapodsのインストール
# rbenvでrubyのインストール
rbenv install 2.1.1
rbenv rehash
rbenv shell 2.1.1
# cocoapodsのインストール
gem install cocoapods
# cocoapodsのセットアップ
pod setup
  • Xcodeでプロジェクトを作る
  • XcodeのFile>New ProjectからJenkinsSample プロジェクトを作る
  • 作成されたディレクトリ配下にPodfileの作成
cd JenkinsSample
vim Podfile
  • Podfileには以下のように書く。とりあえずAFNetworking入れとく
    • platform の 6.0ってのは最低サポートするバージョンってこと。
platform :ios, '6.0'
pod 'AFNetworking'
  • pod installをすると、AFNetworkingをインストールしてくれたりxcworkspaceを作ってくれる
  • 開いているプロジェクトを一旦閉じる
  • JenkinsSample.xcworkspaceを開く
  • Xcode上ではビルドが成功しシミュレータが起動できることを確認
    • あとで気づいたけど、Xcodeの環境設定のlocationがCustomになってたからビルドできたみたい
  • とりあえずGithubの.gitignoreを追加

    gitignore/Objective-C.gitignore at master · github/gitignore · GitHub

コマンドラインでビルド

とりあえずこの状態で、xcodebuildを打つとld: library not found for -lPodsというエラー。

workspaceを指定してやるのかなと思ったので、

xcodebuild -workspace JenkinsSample.xcworkspace -scheme JenkinsSample

これで、ひとまずBUILD SUCCEEDEDになった。

Jenkinsでビルド

  • スレーブとして動いているMacminiにcocoapods入れる
  • cocoapods jenkins pluginとXocde pluginでやってみたがcocoapodsのところがバグっててうまくいかない
  • 普通に、シェルの実行でpod installにした
  • xcode plugin で workspaceとschemeを指定

実行すると以下のエラー。 xcodebuild: error: The workspace 'JenkinsSample' does not contain a scheme named 'JenkinsSample'.

ここで、一度、GUIでworkspaceを立ち上げる必要があるようだ。

あるいは、XcodeからManaged SchemeでSharedにしてソースにコミットしてしまえばいい。 ※こっちの方がいいかも。

f:id:masato47744:20140413211002p:plain

次は、またまたlibPods.aのエラー ld: library not found for -lPods

File > Workspace Settings から Build locationをCustomにしてあげる。

workspace settingでcustomにしてあげて、libPods.aの場所が分かるように。 ※これについては、やらなくてもいいマシンもあったから何とも言えない。

f:id:masato47744:20140413211252p:plain

さてさて次は、今度はこのエラー

Code Sign error: No matching codesigning identity found: No codesigning identities (i.e. certificate and private key pairs) matching “iPhone Developer” were found.
CodeSign error: code signing is required for product type 'Application' in SDK 'iOS 7.1'

多分実機でビルドしようとしているので、Code Signをしようとしているんだと思う。

xcode plugin で sdkに、iphonesimulatorを入れるといけた。

XCTest

  • JenkinsSample.xcodeproj側で、新しいクラスを作るときにTargetに含める
  • 新しいクラスに対するユニットテスト書く
  • コマンド+Uでテスト通ることを確認
  • 次に、コマンドラインでXCTestの実行をする。testとdestinationをつければいいようだ。
xcodebuild test -workspace JenkinsSample.xcworkspace -scheme JenkinsSample -destination 'name=iPad,OS=7.1'

JenkinsでXCTestの実行

  • Xcode Pluginでは実行できない。(できる方法はあるとは思うけどあきらめた)
  • 代わりに、シェルの実行に以下を記載してテストが実行された
xcodebuild test -workspace JenkinsSample.xcworkspace -scheme JenkinsSample -destination 'name=iPad,OS=7.1'
  • このdestinationが結構めんどうで、'name=iPhone Retina (4-inch 64-bit),OS=7.1'みたいにスペースとかハイフンとか括弧とかを間違えないようにしないとダメ。
  • ocunit2junitをJenkinsのスレーブ側に入れておけば、Junit形式のレポート出してくれる。
xcodebuild test -workspace JenkinsSample.xcworkspace -scheme JenkinsSample -destination 'name=iPad,OS=7.1' | ocunit2junit
  • あとは、いつものようにそれをJUnitの集計プラグインで拾えばOK
  • カバレッジとか出すには色々コードに手を入れる必要があるようだ。とりあえずここはあとまわしかな。
  • 最終的なXcode Pluginの内容はこんな感じです。JOB_NAMEはプロジェクトの名前にしてます。

f:id:masato47744:20140414004322p:plain

f:id:masato47744:20140414004336p:plain

f:id:masato47744:20140414004347p:plain