開発中のアプリはMac miniを使ってJenkinsでビルドしています。Xcode 8.3.1がリリースされたことだし、古いバージョンのXcodeを削除してXcode 8.3をインストールしました。Xcode 8.3.1をインストールしていないのは現時点でダウンロードサイトに登録されていないからです。
結論から書くと、xcrun PackageApplication
がとうとう使えなくなったらしくて、xcodebuild -exportArchive
を使うように変更しました。
古いXcodeを削除したらエラーが発生した
ビルドマシンの古いバージョンのXcodeを削除したらJenkinsでエラーが発生しました。
gitでエラー
次のジョブ時にエラーが発生しました。Xcode 6.4がなくてgitにパスが通ってないですよーとエラーになりました。
てっきり最新のXcodeでgit cloneなどが実行されていると思っていたので少し驚きました。まさしく「ゴン、お前だったのか……」感があります。
Caused by: hudson.plugins.git.GitException: Command "git init /Users/ch3cooh/.jenkins/workspace/myapp_staging" returned >status code 1: stdout: stderr: xcrun: error: active developer path ("/Applications/Xcode 6.4.app/Contents/Developer") does not exist Use
sudo xcode-select --switch path/to/Xcode.app
to specify the Xcode that you wish to use for command line developer tools, or usexcode-select --install
to install the standalone command line developer tools. Seeman xcode-select
for more details.
最新のXcode 8.3にパスを通しました。
$ sudo xcode-select --switch /Applications/Xcode\ 8.3.app
スクリプトを修正してXcode 8.3でビルドするように変えた
Jenkinsのビルドスクリプトを書き換えて、Xcode 8.3でビルドするように修正しました。……すると、今まで出ていなかったエラーがでるようになりました。
PackageApplication(ipaファイルの生成)の実行に失敗する
xcrun -sdk iphoneos PackageApplication
でipaファイルを生成していますが、以下のようなエラーが発生しました。
xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
Build step 'シェルの実行' marked build as failure
Warning: you have no plugins providing access control for builds, so falling back to legacy behavior of permitting any downstream builds to be triggered
Finished: FAILURE
ビルド時に、以前のバージョンのCommand Lineを参照してしまうと困るのでリセットしました。
$ sudo xcode-select --reset
Xcode 8.3用のコマンドラインツールがインストールされていないのでエラーがでているのかな?と思ったので、「https://developer.apple.com/download/more/ 」で「Command Line Tools (macOS 10.12) for Xcode 8.3」をダウンロードしてインストールしました。
素直にxcode-select --install
をすればよかったのかもしれない。
PackageApplicationがXcode 8.3でサポートされなくなった
コマンドラインツールをインストールしたのにもかかわらず、相変わらず同じビルドエラーが発生してしまいます。
xcrun: error: unable to find utility "PackageApplication", not a developer tool or in PATH
今思えば、Xcode 8.2.1でビルドすると下記のようなPackageApplicationが非推奨ですとワーニングが出ていました。
warning: PackageApplication is deprecated, use
xcodebuild -exportArchive
instead.
App Store向けのビルドではxcodebuild -exportArchive
に切り替えていたのですが、内部テスト用のAdHoc/In-HouseバイナリはそのままPackageApplicationを使っていました。
ジョブスクリプトを書き換えました。
Xcode 8.2.1まで
xcodebuild -sdk iphoneos \ -workspace ${XCWORKSPACE_NAME} -scheme ${SCHEME_NAME} \ -configuration Release build \ CODE_SIGN_IDENTITY=${CODE_SIGN_ID} \ PROVISIONING_PROFILE=${PROVISIONING_ID} \ SYMROOT=${BUILD_NUMBER_PATH} xcrun -sdk iphoneos PackageApplication "${SOURCE_PATH}" -o ${APP_PATH} \ --embed ~/Library/MobileDevice/Provisioning\ Profiles/${PROVISIONING_FILENAME}
Xcode 8.3.1から
xcodebuild -sdk iphoneos \ -workspace ${XCWORKSPACE_NAME} -scheme ${SCHEME_NAME} \ -configuration Release archive \ -archivePath ${ARCHIVE_PATH} \ SYMROOT=${BUILD_NUMBER_PATH} \ CODE_SIGN_IDENTITY="${CODE_SIGN_ID}" \ PROVISIONING_PROFILE="${PROVISIONING_ID}" xcodebuild -exportArchive \ -archivePath "${ARCHIVE_PATH}" \ -exportPath "${BUILD_NUMBER_PATH}" \ -exportOptionsPlist "${PLIST_FILE_PATH}"
exportOptions.plistを指定する
xcodebuild -exportArchive
ではexportOptions.plist
を指定しないといけません。適当なディレクトリにplistファイルを保存しておきます。
exportOptions.plist
僕が今回ビルドを通したいのはIn-Houseのアプリなので、下記のようにenterprise
と指定しました。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>method</key> <string>enterprise</string> </dict> </plist>
App Store向けのビルドの際には、下記のようにapp-store
と指定しました。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>method</key> <string>app-store</string> </dict> </plist>
関連記事
xcodebuildについての関連記事はこちらでも確認することができます。