🚀

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 ダッシュボードでアプリを選択し、ワークフロー設定画面で以下の手順を実行します:

  1. 「Environment variables」セクションで新しい変数を追加します:

    • APP_APPLE_ID: アプリの Apple ID
  2. 「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

参考:

動作の仕組み

このスクリプトの動作を詳しく説明します:

  1. app-store-connect get-latest-app-store-build-number $APP_APPLE_ID コマンドにより、App Store Connect から最新のビルド番号を取得します
  2. 取得した番号に 1 を加えて新しいビルド番号とします
  3. agvtool new-version -all コマンドを使用して、Xcode プロジェクトの CFBundleVersion を更新します。

これにより、毎回のビルドで自動的にビルド番号がインクリメントされ、App Store へのアップロードが円滑に行えるようになります。

まとめ

Xcodeから手動でビルドしてApp Store Connectへアップロードする場合、このような現象は起きないので、特に意識したことはなかったので、新たな発見でした。pubspec.yamlでビルド番号を管理するのが正攻法なのでしょうが、いちいちビルドの度に変更していられないので、自動インクリメントを実装しました。開発に携わっている人全員が、最新のバージョンを手元で確認できるようになり、効率化されました!

GitHubで編集を提案
株式会社ドットログ

Discussion