2021年10月版 CodemagicでFlutterアプリのCI/CDを構築する【iOS編】

はじめに

ソフトウェアエンジニアの谷藤です。

Codemagic で Flutter アプリの iOS 版の CI/CD を構築するための設定(2021年10月時点)について解説します。

Android 版はこちら

hirotanifuji.hatenablog.com

あくまで Codemagic 上の設定の話なので、Flutter アプリ自体の設定などについては解説しません。

codemagic.io

1. 各連携

Sign up した後に、User settingsより各サービスとの連携を設定します。

f:id:HiroTanifuji:20210926175612p:plain

  • Bitbucket、GitHub、GitLab のどれかを連携させる(Sign upのアカウントとして選択した場合は、連携済み)

  • Developer Portal を連携する

App Store Connect のユーザとアクセスから API キーを発行します。名前はアプリ名 + codemagic key とかで良いと思います。アクセスは Developer で問題ありません。Key をダウンロードしたら大切に保管します。

Codemagicに戻り、App Store Connect API key name には発行した API キーの名前を、Issuer ID と Key ID はページに記載されている値を入力します。また、ダウンロードした API キーをアップロードします。

f:id:HiroTanifuji:20210926180208p:plain

f:id:HiroTanifuji:20210926180338p:plain

  • Slack を連携する(任意)

2. アプリを作成する

Apps タブで Add application を押します。

次に、上記で連携させたホスティングサービス(Bitbucket、GitHub、GitLabのどれか)を選択します。

Select repository には適切なレポジトリを、Select project type には Flutter App を選択して、アプリの作成を完了させます。

f:id:HiroTanifuji:20210926180916p:plain

3. ビルドの設定

Workflow settings

Workflow name にはワークフローの名前を設定します。AndroidAd hoc などとの区別ができれば何でも良いです。

Max build duration には開始から何分後にタイムアウトさせるかを設定します。こだわりがなければ、120分で問題ないと思います。

f:id:HiroTanifuji:20210926182148p:plain

Build for platforms と Run build on

Build for platforms は iOS を選択します。

Run build on は Billing を有効にしていない限り macOS Standard VM しか選択できないと思いますが、好みの VM を選択します。

f:id:HiroTanifuji:20210926182551p:plain

Build triggers

まずは、Automatic build triggering で好みのトリガーを選択します。

合わせて Watched branch patterns や Watched tag patterns も設定します。

例としてmaterブランチにプッシュされたらビルドが走るように設定しました。

f:id:HiroTanifuji:20210926182815p:plain

Environment variables

次は環境変数の設定です。ご自身の環境によって変わるので、以下の中で当てはまる項目のみ参考にしてください。

■ Flavorを設定している場合

Codemagic では、アーカイブ時にデフォルトで Runner Scheme を使っているため、Flavor を設定している場合は、それに合わせて Scheme を変更する必要があります。

ご自身の環境に合わせて、FCI_FLUTTER_SCHEME に値を設定してください。

You haven’t specified the iOS scheme to be used for the archive action of Xcode build. This applies when your app has custom iOS schemes. By default, Codemagic builds the Runner scheme, but you can use the FCI_FLUTTER_SCHEME environment variable to specify another scheme.

docs.codemagic.io

■ プロジェクトで .env を使っている場合

プロジェクトで .env を使っていて、このファイルをリポジトリに含めていない場合は、次の対応が必要になります。

この後の Pre-build script で使うので、.env ファイルを base64 エンコードした値をセットします。

Macを使っている場合、base64 .env | pbcopybase64 エンコード とその内容のコピーができます。

例として ENV にこの値をセットします。

■ プロジェクトで Firebase を使っている場合

プロジェクトで Firebase を使っていて、構成ファイルをリポジトリに含めていない場合は、次の対応が必要になります。

Firebase を使っている場合は、ios/Runner/GoogleService-info.plist として構成ファイルを配置する必要があります。

こちらもこの後の Pre-build script で使うので、GoogleService-info.plist を base64 エンコードした値をセットします。

例として、IOS_GOOGLE_SERVICE にこの値をセットします。

flutter build ipa で --export-options-plist=XXX を指定する場合

ビルド時に、明示的に export オプションファイルを指定していて、その対象のファイルをリポジトリに含めていない場合は、次の対応が必要になります。

こちらもこの後の Pre-build script で使うので、base64 エンコードした値をセットします。

例として、EXPORT_OPTIONS_PLIST にこの値をセットします。

f:id:HiroTanifuji:20210926184351p:plain

Dependency caching

パッケージなどの依存物をキャッシュする場合は有効にします。

有効にすることでビルド時間を短縮できるので、頻繁に回すビルドでは有効にした方がコストの面で良さそうです。

例として、公式に記載の以下の3つをセットします。

$HOME/Library/Caches/CocoaPods(CocoaPods のキャッシュ)

$HOME/.gradle/caches(Gradle のキャッシュ)

$FLUTTER_ROOT/.pub-cacheDart のキャッシュ)

f:id:HiroTanifuji:20210926184620p:plain

Tests

ビルド前に実行されるテストについての設定です。好みに合わせて設定してください。

基本的には、 Stop build if tests or analysis fail は有効にした方が良いと思うので、有効にします。

その他は、例として、Static code analysis の Flutter analyzer のみ有効にします。

f:id:HiroTanifuji:20210926184718p:plain

Pre-build script

ビルド直前に実行させるスクリプトの設定です。

今回は主に、上の Environment variables で設定した base64 エンコード済のファイルをデコードして、適切な位置に配置する目的で使用します。

例として、以下のようなスクリプトを設定します。

#!/bin/sh

# .env を base64 エンコードした値が設定されている ENV をデコードして、配置する
echo $ENV | base64 --decode> $FCI_BUILD_DIR/.env

# GoogleService-info.plist を base64 エンコードした値が設定されている IOS_GOOGLE_SERVICE をデコードして、配置する
echo $IOS_GOOGLE_SERVICE | base64 --decode> $FCI_BUILD_DIR/ios/Runner/GoogleService-Info.plist

# flutter build ipa 時に指定するオプションファイルを base64 エンコードした値が設定されている EXPORT_OPTIONS_PLIST をデコードして、配置する
echo $EXPORT_OPTIONS_PLIST | base64 --decode> $FCI_BUILD_DIR/ios/ExportOptions.plist

f:id:HiroTanifuji:20210926185009p:plain

Build

次に最も重要なビルドについての設定です。

Flutter version や Xcode version 、 CocoaPods version はご自身の環境に合わせて設定してください。特にこだわりがなければ、デフォルトで問題ないと思います。

Project path もご自身の環境に合わせて設定してください。基本的には . だと思います。

iOS build command の Use flutter build ipa は、使っている flutter のバージョンが1.24.0-6.0以降では、有効にした方が良いと思います。

Mode には Release を設定します。

f:id:HiroTanifuji:20210926190325p:plain

Build arguments には flutter build ipa の後に付け加えたい引数を指定します。ご自身の環境に合わせて設定してください。

例として、以下を設定しました。

--export-options-plist $FCI_BUILD_DIR/ios/ExportOptions.plist --flavor production --build-number=$(($BUILD_NUMBER + 10))

--export-options-plist には、上の Pre-build script で配置したファイルを指定します。

flavor を設定している場合は、それも指定します。

--build-number は基本的には $BUILD_NUMBER で良いと思いますが、すでにビルドを App Store Connect にアップロードしている場合は、重複となるためアップロードが失敗してしまいます。

その場合は、--build-number=$(($BUILD_NUMBER + N)) のように、すでにアップロード済みの数(N)を加算したビルド番号を指定するようにしてください。

f:id:HiroTanifuji:20210926212750p:plain

Distribution

iOS code signing と App Store Connect の設定をします。

まずは、iOS code signing です。

Select code signing method には Automatic か Manual を選択します。ご自身の環境に合わせて選択してください。

今回は例として、Manual を選択します。

Code signing certificate には、ご自身の Keychain Access の Default Keychains > login > My Certificates >Apple Distribution を .p12 のフォーマットでエクスポートしたファイルを指定します。

Certificate password には上記の .p12 ファイルをエクスポートした際に設定したパスワードを指定します。

f:id:HiroTanifuji:20210926213530p:plain

Provisioning profiles にはご自身の環境で使っている App Store 用のプロビジョニングプロファイルをアップロードしてください。こちら からダウンロードすることもできます。

f:id:HiroTanifuji:20210926214218p:plain

f:id:HiroTanifuji:20210926214627p:plain

次に、App Store Connect についてです。

まずは、Enable App Store Connect publishing を選択してください。

それ以外の設定は、すでに Developer Portal と連携済みだと思うので、基本的には必要ありません。

f:id:HiroTanifuji:20210926214637p:plain

4. 通知の設定

Email と Slack の通知を設定できます。

好みの設定にしてください。

f:id:HiroTanifuji:20210926214646p:plain

5. ビルド実行

全ての設定が完了したら、ビルドを実行してみましょう。

Start new build から、ビルドしたいレポジトリのブランチと、ビルドの設定をしたワークフローを選択して実行します。

f:id:HiroTanifuji:20210926214839p:plain

成功すると、以下のような通知が届きます。

f:id:HiroTanifuji:20210926215344p:plain

f:id:HiroTanifuji:20210926215350p:plain

さいごに

Codemagic を使って Flutter アプリの CI/CDを構築するための設定方法について解説しました。

ご自身の環境によって変更しないといけない箇所があると思いますが、基本的な設定や詰まりそうな箇所の解説はできたかなと思います。

ご不明点やご指摘などがございましたら、コメントに書いてください。

以下、私が参考にさせていただいた記事になります。

medium.com

medium.com

medium.com

blog.dalt.me

読んでいただきありがとうございました。