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
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にしてソースにコミットしてしまえばいい。 ※こっちの方がいいかも。
次は、またまたlibPods.aのエラー ld: library not found for -lPods
File > Workspace Settings から Build locationをCustomにしてあげる。
workspace settingでcustomにしてあげて、libPods.aの場所が分かるように。 ※これについては、やらなくてもいいマシンもあったから何とも言えない。
さてさて次は、今度はこのエラー
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'
- XCTest側で、cocoapodsを使うには、Podfileに、link_withで、テストのターゲットを追加する。 書式はガイドを参照。 CocoaPods Guides - Podfile Syntax Reference
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はプロジェクトの名前にしてます。