CodemagicでFlutterアプリのビルド・配信をする — iOS編
CI環境を簡単に構築
本記事は主に2019年1月時点での情報で、Codemagicの改善の速さゆえに情報が古いものがあると思います。
以下の記事では、iOS中心にFlutterで環境ごとにビルド設定を変えるプロジェクト設定を行いました。
説明はiOS中心でしたが、サンプルではAndroid版の対応もされています。
本記事では、このサンプルを元にさらに、昨年2018年12月に開催された Flutter Live event で発表された Flutter専用の無料CIサービスであるCodemagicにてCIを構築する過程を解説していきます。
基本的にはとても簡単なのですが、iOSのFlavor周りで苦しいところがありつつ、結果的にはAdHoc配信・TestFlight配信ともにうまくいきました🐶
なお、Android版ビルド〜Google Playへの配信は、あまりハマりどころが無いのと、以下の記事でカバーされているので、本記事ではiOS版のビルドと配信について扱います。
iOSプロジェクト設定
次のようにAutomatically manage signing をオンのシンプルな状態でOKです。
(もちろん明示的に指定したい要件があれば適宜調整してください。)

AdHocビルド
次のように設定します。

Flutter version
基本的にはStableや特定バージョンを指定するのがセオリーだと思いますが、リリース前は手元でBeta最新で開発していればそれに合わせたりするのが良いかなと思いました。
Mode
配信用途の場合はReleaseにするのが普通です。
Build for platforms
ビルド設定を調整するときは片方だけ(今回の場合iOSだけ)にしておくと時間の節約になります。
Build arguments
これが肝です。Flutterで環境ごとにビルド設定を切り替える — iOS編 で調整したようにビルドしたいFlavorを設定します。 --release
は選択肢で設定済みなので、それ以外を入力します。
環境変数として $BUILD-NUMBER
が使えるので、 -build-number=
に与えます。
ちなみに printenv
で調べたところ、Codemagicの環境変数には以下が設定されていました。
Pre build scriptでのワークアラウンド
上の設定だけでうまくいくと嬉しいのですが、ビルドを成功させるためにPre build scriptの欄に以下を追加する必要がありました。
#!/bin/sh
set -e # exit on first failed commandset
set -x # print all executed commands to the log# Workaround for issue #21335
/usr/bin/plutil -replace CFBundleIdentifier -string com.mono0926.flavor.staging2 ios/Runner/Info.plistcp ios/Flutter/Release-Staging.xcconfig ios/Flutter/Release-Production.xcconfig
まず、 plutil
でCFBundleIdentifierを指定しているのは、CodemagicでProvisioning Profileの解決をする際に合致しないIDを取ってきてしまって次のようなエラーが発生してしまった対処です。
❌ Code Signing Error: “Runner” requires a provisioning profile. Select a provisioning profile for the “Release” build configuration in the project editor.
xcconfigをコピーしているのは、 xcodebuid
の際に決め打ちで -scheme Runner -config Release
のオプションが与えられていて変更不可能だったのでxcconfig側で対処しました。
ともに、Codemagicのビルド設定画面でiOSビルド用の設定値が充実すれば解決するはずですが、現状このように対処しました。
AdHoc配信
次のように iOS code signingの欄にDeveloper certificateとProvisioning Profieを指定すればOKです。

[2019/01/18 追記] Automatic code signingに対応しました
本日、Automatic code signingに対応しました🎉

特にManualにしたい要件が無い場合、Automaticがおすすめです。
- 証明書の管理が不要
- Provisioning Profileの管理が不要(登録端末追加にも対応)
- Bundle Identifierを明示できるので、
Pre build script
でのpsutil
を用いたワークアラウンドも不要に
こちらの記事も詳しいです:
Slack通知を設定
次のようにSlack連携させておくと、

このように通知が来て便利です。

AdHocビルド成功〜インストール
諸々ミスなく設定すると、次のように配信されて、インストールできます🎉



TestFlight版ビルド
Pre build script
同じくワークアラウンド処理を挟みます。TestFlight版ビルドの場合xcconfigはデフォルトで問題なかったのでそれはカットしました。
#!/bin/sh
set -e # exit on first failed commandset
set -x # print all executed commands to the log# Workaround for issue #21335
/usr/bin/plutil -replace CFBundleIdentifier -string com.mono0926.flavor2 ios/Runner/Info.plist
ビルド引数
AdHoc版と同じくModeはReleaseを選んだ上で、引数には次のように設定しました。リリース環境へ接続されるようなFlavorを選んでいます。
--flavor production --target lib/main_production.dart --build-number=$BUILD_NUMBER
TestFlight配信
AdHoc版と同じく、TestFlight版に適したProvisioning Profileを設定しておきます。
さらに、TestFlight配信に必要な情報を”App Store Connect”の欄に入力します。

Apple IDは、複数チームに所属しているものだと次のエラーが発生してしまうので、その場合このログイン専用のアカウントを別途作成してそれを指定します。
*** Error: Unable to validate your application. Please sign in with an app-specific password. You can create one at appleid.apple.com.
ITSAppUsesNonExemptEncryption の設定
ビルドが成功してしばらくすると App Store Connect 上に出てくるので、適当に操作すると配信できます。
ただ、次のダイアログが毎回出て面倒なので、

info.plist
に次の設定を追加しておくとこの手間が省けます。
<key>ITSAppUsesNonExemptEncryption</key><false/>
詳しくは以下をご覧ください。
TestFlight版インストール
成功すると、次のようになります🎉


トリガー
以下のように設定しました。
- developブランチ(デフォルト): AdHoc版ビルド
- masterブランチ: TestFlight版ビルド


上のはごく単純な例ですが、ブランチ名のパターンマッチング(複数指定可能)でトリガーを仕掛けることもできます。

GitHubのCI連携は未対応の模様
メジャーなCIサービスは大抵、GitHubのPull RequestのCI連携(ビルドやテストなどの結果を紐付け)が対応されていますが、Codemagicは現状未対応のようで、次のようにデフォルト状態でした。単に間に合ってないだけで、今後対応されていく気がしています🤔

困ったらSlack の Codemagic workspace へ
Codemagicはとてもシンプルなためかドキュメントが見当たりません。そのため、不明点があればSlackのCodemagic workspaceで質問すると良いです。 #codemagic-support チャンネルで質問すれば、中の人が拾ってくれるはずです。
Twitterアカウントでのアナウンス
毎度、Slack の #announcements の内容をそのあとTwitterでも流してくれているので、とりあえずアップデート情報だけ知りたい場合はTwitterウォッチして済ませるのも良いと思います。
FlutterのCIサービスはCodemagic一択?
Bitrise もFlutterサポートが手厚くなったのでCodemagicと同じくらい良い選択だと思っています。
BitriseはOSSプロジェクトに限り、無料で使えます。
関連資料
Codemagicに関する日本語資料では他に以下などあります。
iOSのFlavor周りに起因するビルドエラーをなかなか解決できず辛かったですが、それ以外は最高でした👍
通常、モバイルアプリ開発のCI環境は手間もお金的なコストもけっこう嵩むところですが、Codemagicのおかげでお手軽に構築できる上に無料で素晴らしいです🐶
We will introduce our pay-as-you-go pricing model in January 2019. For Flutter community, there will always be a free plan!