CodemagicでiOSアプリのビルド番号を自動インクリメントさせる
キッカケ
開発中の最新のビルドを Codemagic から Apple Store Connect へデプロイしようとしたところ、エラーが発生しました。
原因は、ビルド番号が重複していたことでした。
実際、バージョンが 0.0.1 (0.0.1) となっていました。かっこ内がビルド番号。
Xcodeから手動でビルドしてApp Store Connectへアップロードする場合は、この問題は通常発生しません。
前提条件
- Flutter プロジェクトがセットアップ済み
- Codemagic アカウントがある
- App Store Connect のアカウントを持っている
- 既にデプロイできる状態にある
- Codemagic のデプロイ方法はこちらの記事を参照
実装
1. アプリの Apple ID を確認
アプリの Apple ID は、App Store Connect の「アプリ」→「あなたのアプリ」→「アプリ情報」→「Apple ID」で確認できます。
2. ビルド自動化の設定(UI から設定する場合)
Codemagic ダッシュボードでアプリを選択し、ワークフロー設定画面で以下の手順を実行します:
-
「Environment variables」セクションで新しい変数を追加します:
-
APP_APPLE_ID
: アプリの Apple ID
-
-
「Pre-build script」または「Post-clone script」セクションに以下のスクリプトを追加します:
# 最新ビルド番号の取得と増分
LATEST_BUILD_NUMBER=$(app-store-connect get-latest-app-store-build-number $APP_APPLE_ID)
echo "Latest build number: $LATEST_BUILD_NUMBER"
cd ./ios # agvtoolはxcodeprojファイルがあるフォルダで実行する必要があります
agvtool new-version -all $(($LATEST_BUILD_NUMBER + 1))
デバッグ用に、最新のビルド番号をログに出力するようにしています。
参考:
(3. 必要に応じて、Dart の環境変数も設定します:)
# dart_defines設定(必要な場合)
mkdir -p $FCI_BUILD_DIR/dart_defines
echo "$DART_DEFINES_PROD" | base64 --decode --output $FCI_BUILD_DIR/dart_defines/dev.json
参考:
動作の仕組み
このスクリプトの動作を詳しく説明します:
-
app-store-connect get-latest-app-store-build-number $APP_APPLE_ID
コマンドにより、App Store Connect から最新のビルド番号を取得します - 取得した番号に 1 を加えて新しいビルド番号とします
-
agvtool new-version -all
コマンドを使用して、Xcode プロジェクトの CFBundleVersion を更新します。
これにより、毎回のビルドで自動的にビルド番号がインクリメントされ、App Store へのアップロードが円滑に行えるようになります。
まとめ
Xcodeから手動でビルドしてApp Store Connectへアップロードする場合、このような現象は起きないので、特に意識したことはなかったので、新たな発見でした。pubspec.yamlでビルド番号を管理するのが正攻法なのでしょうが、いちいちビルドの度に変更していられないので、自動インクリメントを実装しました。開発に携わっている人全員が、最新のバージョンを手元で確認できるようになり、効率化されました!
Discussion