eas build
の際にエラーに苦戦したので、備忘録として、デバッグの際に調べたこと、考えたことを記しておきます。
EASについての基礎知識
eas.jsonの見方などを解説します。build profileの特有な概念があるので、まずここを押さえる必要があると思います。
EAS Build の設定は、すべて "build" キーに属します。 以下のeas.jsonを例に説明を進めます。
{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"preview": {
"distribution": "internal"
},
"production": {}
}
}
build profileとは
Build Profileとは、ある特定のビルドを実行するために必要なパラメータを記述した、名前付きの設定グループのことです。
上記の例では、development, preview, production の3つのBuild Profileがありますが、お好みで foo, bar, baz など好きな名前にすることができます。
特定のプロファイルでビルドを実行するには、eas build --profile <profile-name>
と実行します。--profile フラグを省略した場合、EAS CLI は production という名前のチャンネルが存在すれば、それをデフォルトで使用します。
詳しい設定のプロパティについてはこちらを参照ください、
EASがどのような流れでbuildを進めるか
※ iOSアプリのbuildの流れになります
eas build
を実行すると、ローカルマシンでいくつかのステップを実行してプロジェクトを準備し、その後リモートサービスで実際にプロジェクトをビルドという流れで進みます。
ローカルでのステップ(プロジェクトをeasへ送る前の準備)
- eas.json で
cli.requireCommit
がtrue
に設定されている場合、git index がクリーンであるかどうかを確認します。つまり、cli.requireCommit
がtrue
の場合、gitでcommitできていないファイルが残った状態でbuildしよとすると、まず警告を出されます。 - buildに必要なcredentialsを準備する
-
builds.ios.PROFILE_NAME.credentialsSource
の値に応じて、ローカル credentials.json ファイルまたは EAS サーバーからクレデンシャルを取得します。
remote
モードが選択されているが、まだクレデンシャルが存在しない場合、それらを生成するように指示されます。
-
- Bare projects の場合、EASサーバでビルドできるようにXcodeプロジェクトが設定されているかどうかを確認します(例えば、正しいバンドル識別子とApple Team IDが設定されいるか、など。)
- リポジトリのコピーを含むtarballを作成します。実際の動作は、使用しているVCSのワークフローに依存します。詳しくはこちらをご覧ください。
- プロジェクトのtarballをAWSのプライベートS3バケットにアップロードし、EAS Buildにビルドリクエストを送信します。
※ tarball はtarファイルのこと。(.tat または .tar.gzを拡張子にもつファイル)
リモート(EASのクラウド上)でのステップ
tarballがEAS側に投げられると、ここから先のステップはクラウド上での話になります。
-
buildのための macOS VM 環境が構築される.
- すべてのビルドツール(Xcode、Fastlaneなど)がインストールされた、独自の新しいmacOS VMを取得します。 この環境をローカルで再現するのは相当厳しい、、、
-
先ほどのステップでAWSプライベートS3バケットにアップロードしたtarballを展開します
-
NPM_TOKEN
が設定されている場合、.npmrc
を作成します。(詳しくはこちら) -
package.json が定義されている場合は、
eas-build-pre-install
スクリプト を実行します。 -
プロジェクトのルートで
yarn install
を実行します(yarn.lockが存在しない場合はnpm install
を実行します)。 -
credentialsの作成、復元。以下の内容を行なってくれているようです。
- 新しい keychain の作成
- keychainへ Distribution Certificateをインポート
-
~/Library/MobileDevice/Provisioning Profiles
directory へProvisioning Profileの書き込み - Distribution Certificateと Provisioning Profileがマッチすることの検証 (すべてのProvisioning Profileは、特定のDistribution Certificateに割り当てられ、他の証明書でiOSを構築するために使用することはできません)
-
Managed projects では、追加で
expo prebuild
を実行して、プロジェクトを bare projecte へ変換する -
build profileの
cache.key
値で特定される、以前に保存されたキャッシュを復元する (詳しくはこちら) -
ios directory にて
pod install
の実行 -
package.json が定義されている場合は、
eas-build-post-install
スクリプト を実行します。 -
Provisioning Profile の ID で Xcode プロジェクトを更新します。
-
ios ディレクトリに Gymfile が存在しない場合は作成します (Default Gymfile のセクションを参照してください)。
-
Run
fastlane gym
in the ios directory. -
package.json が定義されている場合は、
eas-build-pre-upload-artifacts
スクリプト を実行します。 -
build profileで定義されたファイルやディレクトリのキャッシュを保存する。 Podfile.lockはデフォルトでキャッシュされます。それ以降のビルドでは、このキャッシュが復元されます。 (Learn more.)
-
build 生成物を private AWS S3 bucket へアップロードする.
- アーティファクトのパスは eas.json の
builds.ios.PROFILE_NAME.artifactPath
で設定することができます。デフォルトはios/build/App.ipaです。artifactPath
には、グロブライクなパターンを指定することができます。ここでは、fast-glob パッケージを使用しています。
- アーティファクトのパスは eas.json の
buildの流れからわかることは、ほとんどの作業がリモートで行われており、見たことのないeasコマンドばかりでした。ローカル環境での検証はかなり効率が悪いということですね、、
ネイティブ開発の経験がない自分は、buildの詳しい過程もあまり分かりませんでした😂
とりあえず、logファイルを見るのが一番
expoのダッシュボードのbuild一覧から、エラーしたbuildの記録を選んで下にスクロールすると、以下のようにXcodes Logsがダウンロードできます。
このファイルは、たとえxcodeを使ったことがない人であっても、頑張って読むべきです
クラウド上でビルドしているEASの環境は、自分のローカルで再現するには相当な労力が必要です。(自分がチャレンジして挫折した)
まず、その環境で起こっているエラーが何なのかを、このログファイルから感じ取りましょう。
画像のRun fastlane
をクリックした際に表示されるログからは大した情報は得られないので、しっかりとエラーの原因を突き詰めるためには、このログファイル一択だと感じました。参考にしていただければと思います。