とても便利なJenkinsですが、 たまによくしっかり ハマるので、その辺のポイントと私なりの解決法を共有します。
XCodeのプロジェクトが他のstatic libraryプロジェクトを含んでいる場合
まず、普通にXCode GUIを使っていてもこの辺は最初ハマることもあるかと思います。
特に static library側の Headerファイルが見つからない! というビルドエラーは結構悩まされます。
しかしこれをXCode GUIで解決するまではFAQのようで、ググると色々出てきます。
例) http://www.cocoanetics.com/2012/01/helping-xcode-find-library-headers/
ポイントは
- static library 側
- Header を public にする
- Public Headers Folder Path を工夫する (Library名とかにするとか)
- 利用する側
- Header Search Paths に 下記を追加しておく
- $(CONFIGURATION_BUILD_DIR)
- "$(BUILD_ROOT)/../IntermediateBuildFilesPath/UninstalledProducts"
- Header Search Paths に 下記を追加しておく
などでしょうか。
他にも色々あるとは思いますが。
本題は、XCode GUIで Build や Archiveはできるのに、jenkinsなどで xcodebuildするときにもう一度ハマるところです。。
Jenkinsでビルド(xcodebuild)すると static library プロジェクトの Headerファイルが見つからない!
結論から言うと、ビルドの引数に原因があります。
target を使わずに、 workspace と schema を使う
Jenkins の Xcode Pluginを使っていると大抵 フォーム上の「Target」 (xcodebuild オプションの -target )を使うことが多いのではないか(?)と思いますが、これだと上手くいかないようです。
Jenkinsフォーム上で「Xcode Workspace File (-workspace)」「Xcode Schema File(-schema)」を指定して、Targetを 指定しない ようにすればおそらく解決すると思います。
ここで注意点は、workspaceの指定の仕方で、
ファイルシステム上では my-app/my-app.xcodeproj/project.xcworkspace
となっている場合、フォーム上では my-app/my-app.xcodeproj/project
と 末尾の.xcworkspace
を削除しないといけない という点です(勝手に付けるようです)。
schemaの定義は 一度 xcodeを起動しないと生成されない?
もう一つ、xcodebuild が schemaを探す時に
my-app.xcodeproj/project.xcworkspace/xcuserdata/<username>.xcuserdatad
をみるようなのですが、それが一度Xcodeを起動しないと生成されない(?)点です。
jenkinsの実行ユーザで一度 Xcodeでそのプロジェクトを起動しておくか、適当に実行ユーザ名でxcuserdatadを作成してリポジトリにCommitしておくかしないと、新規に Cloneした場合などで失敗してしまうでしょう。
私の場合は、リポジトリにCommitしておくようにしました(そう頻繁には変わらないと思うので)。
ipaファイルが作成されない!?
ビルドの後に、ipaファイルを作成することもよくあると思いますが、
こんな感じでエラーになることがあると思います。
** BUILD SUCCEEDED **
Cannot remove *.ipa files from a non-existing directory:
/Users/leon/Work/projects/wearehive/flatstr/build/Flatstr/dev/jenkins/workspace/Snug-debuOLD/build/Debug-iphoneos
Packaging IPA
FATAL: null
java.lang.NullPointerException
その場合、下記にもありますが、
http://stackoverflow.com/questions/10738624/trying-to-compile-an-xcode-project-with-a-workspace-on-jenkins-slave
SYMROOT に ${workspace}/build/[app name]/Build/Products
などと書いておくと治ります。
##(おまけ)Jenkinsで生成したipaファイルをWebからDLしてInstallする方法
XCodeビルドの後に「 シェルの実行 」を追加して、下記のようなスクリプトを貼り付けます。
PACKAGE_NAME, BUNDLE_IDENTIFIER, MASTER_JENKINS, LOGO_IMG_URL は適切に設定してください。
最後に、ビルド後の処理で「 成果物の保存 」を追加して、build/**/*.ipa,build/*
と書いておきます。
これで、ビルドが成功したら HTMLとplistとipaが生成され、JENKINSのJOBページの生成したHTMLからDLしてInstallできるようになると思います。
※ ここではProvisioningファイルなどの設定は割愛していますが、もちろん適切にしておく必要があります。