◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-05-28中級

Claude Code × Xcode Cloud — ci_scripts と TestFlight 自動配信を 1 週間で動かすまでの実装メモ

Fastlane で長く回してきた個人アプリの CI を Xcode Cloud に移行した実装メモです。ci_scripts/ の3つのフックスクリプト、TestFlight 自動配信、dSYM アップロードまで、Claude Code との具体的なやり取りを残しました。

Claude Code265Xcode CloudCI/CD19iOS26TestFlight個人開発130

✦ プレミアム記事

アーティスト・クリエイターの廣川政樹です。普段は壁紙や癒し系の iOS アプリを2014年から個人で運用しています。累計ダウンロードが5,000万を越えたあたりから、CI まわりに少しずつ手を入れる時間が取れなくなり、Fastlane と GitHub Actions の組み合わせを「動いているからとりあえずそのまま」で長く回していました。

ところが今年に入って、開発機を Apple Silicon に移したタイミングで Fastlane match の証明書同期が不安定になり、TestFlight への配信が週に1回は止まる状態になってしまいました。原因の半分は私のローカル環境、もう半分は GitHub Actions の macOS runner 側の更新サイクルです。個人で運用している以上、平日朝7時に Slack 通知で起こされる運用は持続可能ではありません。

そこで2026年5月のゴールデンウィーク明けに、思い切って Xcode Cloud へ全面移行しました。期間は1週間。判断と実装の伴走役として Claude Code を CLI から呼び続け、ci_scripts/ の3つのフックを書き上げ、TestFlight 自動配信と Crashlytics dSYM アップロードまでを動かすまでの記録です。Xcode Cloud に踏み切るか迷っている個人開発者の方の参考になればと思い、詰まった落とし穴と回避手順を中心に残します。

なぜ今あらためて Xcode Cloud か

Xcode Cloud を選んだ理由は3つあります。

第一に、Apple の証明書まわりが「自動署名」のまま完結する点です。Fastlane match を使っていると、署名証明書を専用リポジトリに暗号化して保管し、CI 上で復号する手順を組む必要があります。動いている間は意識しなくて済むのですが、Apple Developer ID の更新や Provisioning Profile の自動再生成で年に何度か止まるのが定常運用の負担でした。Xcode Cloud は App Store Connect 上のチーム証明書を直接利用するため、この経路自体が消えます。

第二に、Apple Developer Program に含まれる無料枠(25時間/月のコンピュート時間)で個人アプリ4本の運用が現実的に収まる点です。私の運用では、ビルド1本あたり平均6〜10分、週20本前後のビルドが発生します。GitHub Actions の macOS runner は同等の処理に1本あたり12〜18分かかっていたため、コンピュート時間ベースでも収まる計算でした。

第三に、TestFlight 配信が Xcode Cloud のワークフロー定義から直接トリガーできる点です。Fastlane の pilot を呼ぶ経路に比べてエラー切り分けが減り、upload_to_testflight で詰まる場面が物理的になくなります。

一方で、Xcode Cloud は「自由度の高い CI 全般」ではありません。GitHub Actions や Bitrise のように任意のコマンドを長時間流すには向きません。逆に言えば、iOS/macOS のビルド・テスト・TestFlight 配信に用途を絞ったときの手数が極端に少ない CI です。私のように「個人運用で iOS アプリ4本だけを安定して動かしたい」というスコープにはよく合います。

ci_scripts/ という仕組みの正体

Xcode Cloud のフックポイントは、Xcode プロジェクトの直下に置く ci_scripts/ ディレクトリで設定します。ここに3つのスクリプトを置くと、Xcode Cloud が次のタイミングで自動的に呼び出します。

  • ci_post_clone.sh — リポジトリの clone 直後(依存解決の前)
  • ci_pre_xcodebuild.sh — xcodebuild 実行の直前
  • ci_post_xcodebuild.sh — xcodebuild 完了の直後(成功/失敗どちらでも)

スクリプトはすべて bash で書き、シェバン #!/bin/sh -e と実行権限が必要です。失敗するとビルド自体が止まる仕様なので、想定外の終了コードを返さないよう注意します。

最初の挫折ポイントは、ローカルでこのスクリプトを試す方法がない点です。Xcode Cloud は GUI から起動する都合上、xcrun simctl のような対話的なテストが効きません。私は Claude Code に「ci_post_clone.sh を書くから、ローカルの bash で CI_WORKSPACE=$(pwd) bash -e ci_scripts/ci_post_clone.sh として乾式実行できる作りに整えてほしい」と頼みました。すると、Xcode Cloud から渡される環境変数を :- で安全にフォールバックさせる形のテンプレートを返してきました。

#!/bin/sh -e
 
# Xcode Cloud は CI_WORKSPACE をプロジェクトルートに設定する。
# ローカル実行時は呼び出し側で同名変数を渡せばそのまま動く。
WORKSPACE="${CI_WORKSPACE:-$(pwd)}"
cd "$WORKSPACE"
 
echo "[ci_post_clone] workspace=$WORKSPACE"

この「ローカルで CI_WORKSPACE=$(pwd) bash -e ci_scripts/... を流せるか」という基準を最初に決めたことで、その後の試行錯誤がだいぶ楽になりました。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦ci_post_clone.sh / ci_pre_xcodebuild.sh / ci_post_xcodebuild.sh の3スクリプトを Claude Code に書かせる具体的なプロンプトと、実際に動いた完成版を全文掲載しています
✦Fastlane match から Xcode Cloud の自動署名へ移す際に詰まった3つの落とし穴と、その回避手順を Before/After のコード比較で示しています
✦TestFlight 自動配信に Crashlytics dSYM アップロードを安全に統合するための ci_post_xcodebuild.sh 完成版と、ビルド時間を 14 分から 6 分まで縮めた工夫を共有しています
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

⟐ Claude Code2026-10-12
SPM に移したら、起動した瞬間にアプリが落ちるようになりました — dyld の一行を Claude Code と読み解いた記録
CocoaPods から Swift Package Manager へ移した直後、ビルドは通るのに起動した瞬間に落ちました。dyld の一行から原因を切り分け、直し方と確認コマンドまでをまとめます。
⟐ Claude Code2026-09-04
Claude Code に project.pbxproj だけは直接触らせていません
Xcode のプロジェクトファイルは、開けなくなる壊れ方より開けてしまう壊れ方のほうが高くつきました。直接編集をやめてスクリプト経由に寄せるまでに測ったことと、いま引いている線を書き残します。
⟐ Claude Code2026-09-20
Pro を払っているのに Console に請求が立っていたとき、私が最初に見た一行
サブスクリプションと API の従量は別会計で、Claude Code はそのどちらでも動きます。どちらが選ばれているかを決めるのは優先順位で、ログインはその最下段です。status の読み方と、無人実行だけが別の答えを返す理由を書き残します。