エラー「Path /Applications/Xcode-X.X.app doesn't exist」の解決方法

このエラーが発生する理由

以前は正常に動作していた Xcode ビルド パイプラインで、エラーが発生するようになる場合があります。

CircleCI の Xcode パッチ ポリシーでは、サポート対象の Xcode の各 major.minor バージョンに対して CircleCI では最新のパッチ バージョンを保持すると規定しています。 新しいパッチ バージョンがリリースされた場合、過去のパッチ バージョンのサポートを終了し、すべてのリクエストを新しいパッチにリダイレクトします。

ハードコーディングされた Xcode パスが fastlane の設定ファイルで使用されている場合、Xcode アプリのパスに Xcode のバージョン番号が含まれているために、新しいパッチ バージョンがリリースされるとエラーが発生するようになります。

例:

Xcode 12.1.0 イメージを使用し、fastlane アクションの 1 つで /Applications/Xcode-12.1.app を指定しているとします。

Xcode 12.1.1 がリリースされた場合、12.1.0 のリクエストはこの新しいイメージへリダイレクトされるようになります。 これに伴い、新しい Xcode アプリ パスは /Applications/Xcode-12.1.1.app となるため、既存のジョブは失敗して Path '/Applications/Xcode-12.1.app' doesn't exist と表示されるようになります。

パスのハードコーディングを使わないベスト プラクティス

CircleCI では、すべてのイメージで、汎用パスに Xcode のシンボリック リンクを設定しています。 たとえば、次のとおりです。

/Applications/Xcode-12.1.app -> /Applications/Xcode.app

汎用パスを使用すれば、Xcode のバージョンにかかわらず、すべてのイメージで一貫性が保たれますので、CircleCI ジョブでは可能な限り汎用パスを使用するようにしてください。

また、変数と CI 環境のテストを使用することで、CircleCI 上で実行するジョブにハードコードしたパスを含めないようにすることができます。 具体的な例は、次のようになります。

# fastlane/Fastfile

xcodePath = "/Applications/Xcode-12.1.app"

platform :iOS do
before_all do
setup_circle_ci
if is_ci
xcodePath = "/Applications/Xcode.app"
end
end
...
end

上記では、変数 xcodePath を設定し、この変数に Xcode への必須のパスを格納しています。 また、if is_ci を使用することで、ジョブが CircleCI 上で実行されているかどうかをチェックしています。実行されている場合は、汎用の Xcode パスを設定します。 これによって、ローカル環境での実行時には、必要であればハードコーディングされたパスを使用しながら、CircleCI 環境では汎用のシンボリック リンク パスを使用できます。これにより、Xcode のバージョンが変更された場合でも、ジョブが停止されないようになります。

この記事は役に立ちましたか?
2人中1人がこの記事が役に立ったと言っています