酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Xcode 8.3でxcrun PackageApplicationが使えなくなってしまったので対策しました

開発中のアプリは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 use xcode-select --install to install the standalone command line developer tools. See man 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についての関連記事はこちらでも確認することができます。