Flutter 🇯🇵
Published in

Flutter 🇯🇵

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.plist
cp 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!

https://codemagic.io

--

--

--

Flutterに関する日本語記事を書いていきます🇯🇵

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
mono 

mono 

Software Engineer(Flutter/Dart, Firebase/GCP, iOS/Swift, etc.) / Freelance / https://mono0926.notion.site/mono-Masayuki-Ono-8959cd3bd40142e19ec433c5cd5b449b

More from Medium

Push Communication Notification in IOS 15

Flutter CI/CD setup using GitHub Actions , fastlane and Firebase App Distribution for Android

What is async, async*, sync*, yield and yield* keywords in dart?

Using Huawei Cloud Functions as Chatbot Service in Flutter ChatBotApp Part-2