From eas-deploy
Automates Expo EAS iOS/Android deployment: credentials/App ID setup, EAS builds, TestFlight distribution, App Store submission via CLI scripts.
npx claudepluginhub sean-sunagaku/claude-code-plugin --plugin eas-deployThis skill uses the workspace's default tool permissions.
任意の Expo プロジェクトの iOS/Android デプロイを CLI から自動実行する。
Deploys Expo apps with EAS CLI to iOS App Store, Android Play Store, TestFlight, web hosting. Includes build commands, submissions, eas.json configs, and CI/CD workflows.
Deploys Expo apps to production via app stores (iOS App Store, Google Play) and OTA updates. Guides builds, submissions, release channels, and optimization.
Builds and deploys Expo apps with EAS Build, covering eas.json profiles for development, preview, production; secrets, env vars, hooks, and multi-environment configs.
Share bugs, ideas, or general feedback.
任意の Expo プロジェクトの iOS/Android デプロイを CLI から自動実行する。
Step 1: 証明書・Bundle ID セットアップ ← 実装済み
Step 2: EAS ビルド ← 実装済み
Step 3: TestFlight 配布 ← 実装済み
Step 4: App Store 提出 ← 実装済み
eas whoami # ログイン確認 (なければ: eas login)
eas --version # CLI 確認 (なければ: npm install -g eas-cli)
# カレントディレクトリから eas.json を自動検出(推奨)
bash ~/.claude/skills/eas-deploy/scripts/setup-credentials.sh
# サブディレクトリ指定(相対パスで OK)
bash ~/.claude/skills/eas-deploy/scripts/setup-credentials.sh ./mobile
# Android の場合
bash ~/.claude/skills/eas-deploy/scripts/setup-credentials.sh ./mobile android
環境変数でオーバーライド可能:
BUNDLE_ID=com.example.app bash ~/.claude/skills/eas-deploy/scripts/setup-credentials.sh
EAS_PLATFORM=android bash ~/.claude/skills/eas-deploy/scripts/setup-credentials.sh
スクリプトは stdin が対話可能かを [ -t 0 ] で自動判定する。
| モード | 判定条件 | 動作 |
|---|---|---|
| 対話 | ターミナルから直接実行 | チェック → 問題あれば自動修正 → eas credentials 実行 |
| 非対話 | Claude Code 等から実行 | チェック → 問題を一覧表示 → 実行すべきコマンドを出力 |
Claude Code から実行した場合、Apple ID 認証が必要な eas credentials は実行せず、
コピペ用のコマンドを提示する。ユーザーは自分のターミナルでそれを実行する。
projectId の有無)eas init を自動実行eas credentials 実行後、以下の順に選択する:
| # | プロンプト | 選択 |
|---|---|---|
| 1 | Which build profile? | production |
| 2 | What do you want to do? | Build Credentials |
| 3 | Distribution Certificate | Set up a new one (または既存を選択) |
| 4 | Provisioning Profile | Set up a new one (または既存を選択) |
途中で Apple ID + 2FA コード (6桁) の入力が必要。
| エラー | 対処 |
|---|---|
Apple ID authentication failed | 2FA コード入力、または App-specific password 生成 |
Bundle ID already exists | Apple Developer Portal で確認、別 ID に変更 |
Missing Apple Developer Program | developer.apple.com で加入 (年99ドル) |
ビルド前に以下が設定されていることを確認し、なければ自動で追加する。
eas.json — cli.appVersionSource (将来必須):
{
"cli": {
"appVersionSource": "remote"
}
}
app.config.ts — ios.infoPlist.ITSAppUsesNonExemptEncryption (暗号化申告):
ios: {
infoPlist: {
ITSAppUsesNonExemptEncryption: false
}
}
これがないと毎回ビルド時に対話的に聞かれる。
独自暗号化を使っていない場合は false で OK(HTTPS は標準暗号扱い)。
ユーザーにローカルビルドかクラウドビルドかを確認する。 デフォルトはローカルビルドを推奨する。
| 方式 | コマンド | 特徴 |
|---|---|---|
| ローカル(推奨) | eas build --local | 無料、高速、Xcode 必須 |
| クラウド | eas build | Xcode 不要、EAS クレジット消費、アップロード時間あり |
# App Store 用
eas build --platform ios --profile production --local
# 内部配布 (AdHoc)
eas build --platform ios --profile preview --local
# シミュレータ / dev-client
eas build --platform ios --profile development --local
前提条件:
xcode-select -p で確認)pod --version で確認、なければ sudo gem install cocoapods)eas build --platform ios --profile production
ビルドは EAS サーバー上で実行され、完了まで数分〜十数分かかる。
確認: eas build:list --platform ios --limit 1
| # | プロンプト | 選択 |
|---|---|---|
| 1 | iOS app only uses standard/exempt encryption? | yes (HTTPS のみなら) |
| 2 | Do you want to log in to your Apple account? | yes |
| 3 | Distribution Certificate を再利用するか | yes (既存があれば再利用) |
| 4 | Generate a new Apple Provisioning Profile? | yes |
| エラー | 原因 | 対処 |
|---|---|---|
Failed to restore metadata: File exists + tar エラー | macOS メタデータ (._*) や vim スワップ (.swp) が git に入っている | git rm --cached で除外 + .gitignore に ._* と *.swp を追加 |
cli.appVersionSource is not set | eas.json に未設定 | "appVersionSource": "remote" を追加 |
ITSAppUsesNonExemptEncryption を毎回聞かれる | app.config.ts に未設定 | ios.infoPlist.ITSAppUsesNonExemptEncryption: false を追加 |
Cannot automatically write to dynamic config | app.config.ts は動的設定なので EAS が自動書き込みできない | 手動で app.config.ts に追記する(EAS のログに追加すべき JSON が表示される) |
ビルド前チェック(自動で実行すべき):
# macOS メタデータが git に入っていないか確認
git ls-files | grep '/\._'
# .gitignore に ._* と *.swp が含まれているか確認
grep -q '._\*' .gitignore || echo '._*' >> .gitignore
grep -q '*.swp' .gitignore || echo '*.swp' >> .gitignore
App Store Connect にビルドをアップロードし、TestFlight でテスターに配布する。
# クラウドビルドの場合(最新ビルドを自動選択)
cd <project-dir> && eas submit --platform ios --latest
# クラウドビルドを手動選択
cd <project-dir> && eas submit --platform ios
# ローカルビルド (.ipa) の場合
cd <project-dir> && eas submit --platform ios --path ./build-xxxxx.ipa
eas submit --platform ios を実行すると以下の順に進む:
1. What would you like to submit?
→ "Select a build from EAS" を選択
2. Which build would you like to submit?
→ 最新のビルド (数分前のもの等) を選択
※ "production" プロファイルのビルドが表示される
3. App Store Connect 確認
→ "Ensuring your app exists on App Store Connect" が自動実行
→ ascAppId を submit profile に設定済みならスキップ可
4. Apple ID ログイン
→ Apple ID を入力
→ セッションが残っていれば "Restoring session" で自動ログイン
→ Team / Provider が自動選択される
5. 初回のみ自動実行される処理:
→ Bundle identifier registered (App ID 登録)
→ TestFlight group created: "Team (Expo)"
→ TestFlight access enabled for: <Apple ID>
6. App Store Connect API Key
→ 既存の API Key があれば "Reuse this API Key?" → yes
→ なければ自動生成される
→ API Key が submit 用に割り当てられる
7. 提出サマリーが表示される:
ASC App ID: <数字>
App Store Connect API Key: <Key Name / Key ID>
Build: <Build ID / Date / Version / Build Number>
8. Submission スケジュール → 自動で開始
→ "Submitting your app to Apple App Store Connect: submission in progress"
→ 完了まで数分待つ
# 提出状況の確認
eas submit:list --platform ios --limit 1
提出完了後、App Store Connect で処理されるまで数分〜数十分かかる。 処理が完了すると、TestFlight タブにビルドが表示される。
初回 submit 後、eas.json に ascAppId を追加するとログイン不要になる:
{
"submit": {
"production": {
"ios": {
"ascAppId": "<ASC App ID の数字>"
}
}
}
}
| エラー | 原因 | 対処 |
|---|---|---|
No builds found | ビルドが完了していない | eas build:list で状態確認 |
Selected build uses "production" but submit profile missing | eas.json に submit profile がない | 無視して OK(デフォルト production が使われる)、または submit.production を追加 |
App Store Connect API error | API Key 未設定または権限不足 | App Store Connect で API Key を確認 |
Missing compliance | 暗号化の申告が未完了 | ITSAppUsesNonExemptEncryption: false を app.config.ts に設定 |
| Apple ID ログインループ | セッション切れ | キャッシュ削除: rm -rf ~/.app-store/auth/<apple-id>/ |
TestFlight で動作確認が取れたら、App Store に審査提出する。
App Store Connect で以下が設定済みであること:
| 理由 | 対処 |
|---|---|
| クラッシュ / バグ | TestFlight で十分テストしてから提出 |
| 不完全なメタデータ | スクリーンショット・説明文・プライバシーポリシーを全て埋める |
| ログイン必要だがテストアカウント未提供 | 審査メモにテストアカウント情報を記載 |
| 課金がある場合の説明不足 | サブスクリプション説明・利用規約を明記 |