Closed9

Xcode Cloudを使用してTestFlightに自動アップロードできるようにする

Narumi MiuraNarumi Miura
  • Xcode Cloud を使用するには、次のことが必要
    • Apple Developer Programに登録されている必要がある
    • Xcode 15 以降を使用している
    • Xcode 設定のアカウントに Apple アカウントを追加する
    • App Store Connectにアプリのアプリがあるか、アプリ レコードを作成するために必要な役割または権限を持っている必要がある

公式の説明
https://developer.apple.com/documentation/xcode/configuring-your-first-xcode-cloud-workflow
https://docs.flutter.dev/deployment/cd#post-clone-script

Narumi MiuraNarumi Miura

ios/ci_scriptディレクトリを作成して、その中でci_post_clone.shファイルを作成。
ci_post_clone.shにFlutter公式に書いてあるワークフローをまずはコピペしました。

そしてこちらも参考にしながらGithubと連携しました。
https://zenn.dev/naipaka/scraps/807963171ec6d9

Githubとの連携

Xcodeでプロジェクトを開き、Report Navigatorから「Cloud」ボタンをクリックし、「Get Started」を選択します。

Nextを押してポチポチ進んでいきます。

.envは.gitignoreに書いておりリポジトリにpushしてないので、ないとエラーがでた。

Environmentで、環境変数として登録する

ワークフローに動的に.envを作成するように追加

# 環境変数 GEMINI_API_KEY を .env ファイルに書き出す
echo "GEMINI_API_KEY=${GEMINI_API_KEY}" > .env

# dart-defineを使用してAPIキーを渡す
flutter build ios --config-only --dart-define=GEMINI_API_KEY=${GEMINI_API_KEY}

動的に.envファイルを作成したけど、エラーは変わらず。。。
参考記事
https://qiita.com/sugijotaro/items/43505f5ec05a0b0c3cd3

Narumi MiuraNarumi Miura

ログを出力して確認してみたら、「.env ファイルを作成しました。」と出力されているのに、Error (Xcode): No file or variants found for asset: .env.が出ていた。

# .env ファイルを作成
if [ ! -f .env ]; then
  echo "GEMINI_API_KEY=${GEMINI_API_KEY}" > .env
  echo ".env ファイルを作成しました。"
else
  echo ".env ファイルは既に存在します。"
fi

# dart-defineを使用してAPIキーを渡す
flutter build ios --release --dart-define=GEMINI_API_KEY=${GEMINI_API_KEY} --no-codesign

https://developer.apple.com/documentation/xcode/writing-custom-build-scripts

Narumi MiuraNarumi Miura

.envファイルを作成してから、flutter pub getをするように修正。また、.envが作成していることの確認として、ディレクトリの内容を表示させ、pubspec.yaml の flutter.assets に追加されているか確認できるようにした。

#!/bin/sh

# スクリプトが失敗した場合にエラーを返す
set -e

# スクリプトの実行ディレクトリをリポジトリのルートに変更
cd $CI_PRIMARY_REPOSITORY_PATH

# 指定されたFVMのバージョンを取得
FLUTTER_VERSION=$(cat .fvm/fvm_config.json | grep "flutter" | cut -d '"' -f 4)

# Flutterのリポジトリをクローン
git clone https://github.com/flutter/flutter.git --depth 1 -b $FLUTTER_VERSION $HOME/flutter
export PATH="$PATH:$HOME/flutter/bin"

# Flutterのバージョンを表示
flutter --version

# FlutterのiOS用アーティファクトをインストール
flutter precache --ios

# .env ファイルを作成
if [ ! -f .env ]; then
  echo "GEMINI_API_KEY=${GEMINI_API_KEY}" > .env
  echo ".env ファイルを作成しました。"
else
  echo ".env ファイルは既に存在します。"
fi

# Flutterの依存関係をインストール
flutter pub get

# CocoaPodsをインストール
HOMEBREW_NO_AUTO_UPDATE=1 # Homebrewの自動更新を無効化
brew install cocoapods

# CocoaPodsの依存関係をインストール
cd ios && pod install

# ディレクトリの内容を表示
echo "ディレクトリの内容を表示"
ls -la

# pubspec.yamlの内容を表示
echo "pubspec.yamlの内容を表示"
cat pubspec.yaml

# dart-defineを使用してAPIキーを渡す
flutter build ios --release --dart-define=GEMINI_API_KEY=${GEMINI_API_KEY} --no-codesign

exit 0

iosディレクトリでpubspec.yamlを表示してたのでエラーになったので、リポジトリのルートに戻るようにした

# CocoaPodsの依存関係をインストール
cd ios && pod install

# リポジトリのルートに戻る
cd $CI_PRIMARY_REPOSITORY_PATH

# ディレクトリの内容を表示
echo "ディレクトリの内容を表示"
ls -la

# pubspec.yamlの内容を表示
echo "pubspec.yamlの内容を表示"
cat pubspec.yaml
Narumi MiuraNarumi Miura

.envを動的に作成したので、--dart-define=GEMINI_API_KEY=${GEMINI_API_KEY}で環境変数を設定する必要はなかったので削除

flutter build ios --release --no-codesign

.envが見つからないエラーは解決した!

Narumi MiuraNarumi Miura

現在 App Store Connect に登録されているバージョン (1.1.3) と同じバージョンを使って新しいビルドをアップロードしようとしているためエラーがでた

バージョンとビルド番号を更新して再チャレンジ

- version: 1.1.3+6
+ version: 1.1.4+7

https://zenn.dev/naipaka/scraps/807963171ec6d9

Narumi MiuraNarumi Miura

TestFlightにデプロイは成功したけど、指定した番号が7でデプロイされたビルド番号11になっており、異なっていた

解決方法がわからないので、とりあえずpubspec.yamlのビルド番号をXcode cloudで指定されるビルド番号に合わせることにした。

Narumi MiuraNarumi Miura

私のアプリでは、iOSウィジェットを提供するためのApp Extensionを作成しており、アプリのバージョンは1.1.4ですが、habit_appExtension (ウィジェット) のバージョンは 1.0になっていることでエラーがでていました。

pubspec.yamlでバージョン更新後、flutter build iosしてもXcodeのバージョンが変更されず、現状解決できないので、今後の課題とします。これはアプリ本体同様にpubspec.yamlのversionをXcodeに反映できない状況です。。。

なので、pubspec.yamlでのバージョンを更新と、XcodeのGeneralでの直接変更どちらも行いました。

Narumi MiuraNarumi Miura

TestFlightに自動配信されなかったので、PostActionとして登録すると、無事配信されました!

このスクラップは5ヶ月前にクローズされました