Codemagic でモバイルアプリの CI/CD を始めましょう (updated 2021)

[Codemagic](https://codemagic.io/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang) は、[今年の２月に発表された Flutter UX 調査チームによる Q4 2019 の調査結果](https://medium.com/flutter/improving-flutter-with-your-opinion-q4-2019-survey-results-ba0e6721bf23)において、開発者が CI/CD で採用しているサービスのトップ３に挙げられており、（Codemagic、 Github Actions、 GitLab）、その中でも満足度が最も高かったことが示されています。

Codemagic は、Google と提携して Flutter 専門の CI/CD サービスとして開始されただけあって、Flutter を手厚くサポートしています。また、以下の翻訳で示されているように、Flutter に加えて Android ネイティブ、 iOS ネイティブ、React Native のサポートが追加されましたので、既存のそれらのアプリの資産がある場合でも、Codomagic をすべてのアプリに対応する統一した選択肢として検討できるようになりました。

また、プライベートリポジトリでも[クレジットカード登録なしで使える無料枠が用意されています](https://codemagic.io/pricing/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)ので、試用を開始する敷居がとても低いです。

[公式のドキュメンテーション](https://docs.codemagic.io/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)や[公式ブログ](https://blog.codemagic.io/)の内容も、英語ではありますが、まずまず充実していると言えるのではないでしょうか。

あらたに Flutter プロジェクトを始める際の CI/CD サービスの選定作業については、Codemagic の試用から始めるのがひとつの無難な選択肢でしょう。

以下が、[オリジナルの英語記事](https://blog.codemagic.io/getting-started-with-codemagic/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)の日本語訳です。
![codemagic-blog-getting-started-with-codemagic.ecdfe0547c7678263bedb56f1533acb13784617e42a96812891fe87bd3b2e03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/cd6fa5bd-e6ff-91b5-5256-c80aec1c0fcb.png)
2018 年にロンドンで開催された [Flutter Live](https://developers.google.com/events/flutter-live/) おいて、 Nevercode は Google と提携し、Flutter アプリ専用の CI/CD ソリューションとして [Codemagic](https://codemagic.io/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang) を立ち上げました。Codemagic を使えば、Flutter アプリを辛い設定作業をせずにテストしてリリースできます。

Codemagic は Flutter の扱いに熟達していますが、今やそれだけにとどまりません。Flutter アプリでないネイティブアプリでも同等に扱えるように、`codemagic.yaml`ファイルを使用して、ネイティブの [Android](https://blog.codemagic.io/native-android-getting-started-guide-with-codemagic-cicd/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang) と [iOS](https://blog.codemagic.io/native-ios-getting-started-guide-with-codemagic/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang) アプリ、および React Native アプリの設定とビルドができるようになりました。スクリプトをより詳細に制御したい場合は、カスタムスクリプトを実行したりカスタムワークフローを作成できます。高品質なアプリをさらに迅速に開発できるようになりました。

ここでは、Codemagic を使えば、Flutter アプリ、Android ネイティブ アプリ、 iOS ネイティブ アプリ、React Native アプリの CI/CD をいかに簡単に設定できるのかを、その手順を説明を通じてご紹介いたします。

## 必要条件

Flutter アプリ、iOS ネイティブアプリ、Android ネイティブアプリ、React Native アプリを Codemagic 上でセットアップするには、いくつかのものが必要です。

1. もちろん、Flutter アプリ、iOS ネイティブアプリ、Android ネイティブアプリ、React Native アプリとそのテストコードが必要です。そして、それらのアプリは GitHub、GitLab、または Bitbucket でホストされていることを念頭に置いています。
2. App Store や Play Store に公開したい場合は、証明書や Provisioning Profile のようなコード署名を用意します。
3. ビルドレポートやアーティファクトを送信する場合は、Slack のワークスペースを用意します。

以上です。これでアプリに CI/CD を追加する準備ができました。では、実際に設定することを通じて、基本的なことを説明していきましょう。なお、コード署名と公開作業についてはこのチュートリアルでは対象とせず、別途説明とさせていただきます。

## Codemagic にアカウント登録

最初の一歩は、[codemagic.io](https://codemagic.io/login/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)ウェブサイトにアクセスし、GitHub、GitLab、または Bitbucket のアカウントで Codemagic のアカウント登録をすることです。これで、そのサービスのすべてのリポジトリーを Codemagic アカウントに統合して扱えるようになります。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/462cf33a-4331-2ee7-7e7f-5058d9b7cce4.png)

## アプリケーション ダッシュボード ( Applications Dashboard )

サインインすると、Codemagic のダッシュボードにアプリのリポジトリーの一覧が表示されます。一覧をフィルターにかけたり検索したりして、ビルドしたいアプリを見つけることができます。初回のアクセスでは、以下のように表示されるでしょう。
![app_not_configured.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/5aecfeb1-6372-dc7a-8db6-2a9d0bab42aa.png)

ビルドのワークフローを設定するには、**Set up build**ボタンをクリックします。

設定がすでに済んで、まだビルドを開始していない場合は、このように表示されます。
![app_configured.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/d1b8a825-3a55-43c4-645a-58071d73e1fa.png)

**Finish build setup** をクリックして設定を終え、ビルドを開始できます。



ちなみに、以前に Codemagic 上でビルドしたアプリがある場合は、以下のような表示になります。
![app_built.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/58ef7fd8-46af-c699-afba-92232c7f3e1d.png)


**Start new build** をクリックして以前の設定でビルドを開始したり、**Settings**（歯車のアイコン）をクリックして変更したりできます。

## ビルドの設定

**Set up build**ボタンをクリックすると、このページが表示されます。ここでは、プロジェクトの種類を選択できます。
![viimane.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/33f6bc03-4c3b-35a8-456d-45312263720e.png)

この一覧から適切なもの選択するだけです。選択すると、ワークフローの設定画面に移動します。

## Flutter の設定

このページでは、以下のような UI で Flutter アプリのビルドワークフローを設定できます。
![workflow_config_flutter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/5617496b-a91a-17e9-b15a-e5ae9accf396.png)

ビルドワークフローをより詳細に制御したい場合は、**Download configuration** ボタンをクリックして `codemagic.yaml`ファイルを使用できます。
![yaml_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/b54da34e-822a-e082-6831-cb1259bc74c2.png)

この`codemagic.yaml`ファイルを使用して、ワークフローを変更できます。プロジェクトのルートディレクトリに置いて、VCS にコミットするだけです。リポジトリーにこのファイルがあれば、Codemagic が自動的に検出します。

**Start your first build** ボタンをクリックして、Flutter アプリのビルドをすぐに開始できます。ワークフローをまだ変更していない場合は、以下の一連のステップのデフォルトのワークフローが使用されます。
![default_workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/aa8e32ae-6229-9069-041d-3c96520a4707.png)

## その他の設定

Flutter アプリ以外のプロジェクト（Android ネイティブアプリ、iOS ネイティブアプリ、React Native アプリ、または Flutter Module）をビルドする場合は、`codemagic.yaml`ファイルを使用してワークフローを設定する必要があります。選択したプロジェクトの種類ごとにテンプレートが用意されています。
![android_config.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/0baa1509-d12e-b1d4-1757-e05f8ae73806.png)

## ビルドレポート

ビルドが終了すると、Codemagic のダッシュボードに、ビルド時間、ビルドステータス、コミットなどの概要とそれらの詳細が以下のように表示されます。
![build_report.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/81678516-755e-e4d9-f34b-5c92dc0ab2a2.png)
これに加えて、デフォルトでは iOS と Android アプリの両方の、ビルドのステータスとアーティファクトがメールで送信されます。メールの内容は以下のようになります。

![email.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/d537374c-e008-6fda-e321-1000d328d811.jpeg)

Slack の設定をすることで、Slack チャンネルにビルドレポートを投稿させることもできます。

以上です！なにも設定しなくても Flutter アプリに CI/CD サポートを追加できました。これが **Codemagic** のマジックです。

## ビルドの失敗

ここまでは、すべてが完璧に動作しているハッピーパスのシナリオを説明してきましたが、現実の世界では必ずしもそうなるとは限りません。ビルドに失敗したり、テストに失敗したり、調査が必要な問題が発生することもあります。Codemagic は、各段階においてそれが成功したか失敗したかに関わらず、詳細なログを提供しています。これらのログは失敗したビルドをデバッグするのに非常に便利です。以下の画面は、ユニットテストが失敗していて、ビルドの失敗のすべての詳細がログに記録されているものです。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/f60f618b-c8d3-944e-d5a0-a2dc63e7f9ac.png)

見ての通り、インテグレーションテストとウィジェットテストは成功していますが、ユニットテストが失敗しています。これを修正することでビルドを修正できました。テストが失敗すると、それを知らせるメールもビルドログへのリンク付きで届きます。

ビルドの失敗についてもっと詳しく知るには、[モバイルアプリの CI ビルドが失敗してしまう、よくある 12 個の設定間違い](https://blog.codemagic.io/top-12-configuration-mistakes-that-will-fail-your-mobile-ci-build/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang) をお読みください。

# デフォルトワークフローとカスタムワークフローの比較

デフォルトのビルドワークフローには CI/CD ワークフローに必要となる基本的なものが含まれていますが、ほとんどの場合、ビルドプロセスの一部になんらかのカスタマイズを加える必要があります。例えば、ビルドステータスを Slack や他のコミュニケーションチャンネルに送信したり、アーティファクトを Fabric や HockeyApp などの他のサービスに発行したい場合があります。これらのシナリオを実現するためには、カスタムワークフローを作成し、カスタムスクリプトを実行します。それでは、プロジェクトの必要に応じてワークフローをカスタマイズする方法を見ていきましょう。

## Build フェーズ

Codemagic における Flutter アプリの Build フェーズには、ビルドプロセスを定義するためのさまざまな手段があります。どのブランチをビルドするか、そして何のイベントをきっかけにしてビルドするかを選択することから始めます。
![build_triggers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/d345da3c-d6bb-4e3c-e19a-10f42ccb639a.png)

次に、Godemagic では、以下のようなもっと詳細な設定も可能です。

1. Flutter のバージョン
2. アプリをビルドする設定。debug や release など
3. iOS や Android、またはその両方といったプラットフォームの選択
4. Xcode のバージョン
5. カスタムビルドの引数

デフォルトのワークフローでは、以下の設定が選択されています。
![build_default.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/ff530daa-1446-e752-5c0b-2a19feb0e5c0.png)

とは言え、ビルドプロセスはデフォルトの動作をプロジェクトの必要に応じて変更することで、いつでもカスタマイズできます。Xcode の異なるバージョンや異なるリリース設定でアプリのビルドが、上記の画面のオプションの変更、さらにカスタムワークフローによって可能です。

Codemagic のもう一つの大きな特徴として、すべてのフェーズの前にカスタムスクリプトを追加できます。これにより、開発者は各フェーズの前後で任意のコマンドを実行できます。カスタムスクリプトを設定するには、単純に Build、Test、Publish などの各フェーズの上部にある `+` ボタンをクリックします。ここでは、Build フェーズの前に配置するスクリプトの例を示します。
![pre_build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/7b63313e-4898-3f81-2760-68cff62d3921.png)

## Test フェーズ

Codemagic の Test フェーズでは、開発者はテストの有効化と無効化を切り替えられます。プロジェクトで実行する Flutter テストの種類を選択できますし、テスト中に使用する追加の引数の指定もできます。プロジェクトで **Flutter Driver tests** を使用している場合は、使用するエミュレータの種類も指定できますし、**AWS Device Farm** の恩恵も受けられます。

[こちら](https://flutter.dev/docs/testing)で、Flutter のテストに関する詳細をご覧いただけます。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/5eb73187-df59-98f2-d992-094aa8b35e6c.png)

とは言え、デフォルトの動作を無効にして、カスタマイズしたテストコマンドを使用することも可能です。例えば、コマンドラインから UI テスト（訳注: Flutter のインテグレーションテスト) だけを実行したい場合は、次のコマンドを pre-test フェーズに追加します。

```shell
flutter drive --target=test_driver/main.dart
```

これにより、デフォルトのテストワークフローを使用する代わりに、このコマンドが実行されます。

# Publish フェーズ

Codemagic の Publish フェーズでは、ビルドレポートやアーティファクトの公開のための様々な設定が必要です。デフォルトでは、あなたが GitHub/Bitbucket/GitLab にメールアドレスを提供している場合は、メールアドレスだけが設定されています。

このフェーズでは、その他にも以下のものを明示的に設定する必要があります。

1. iOS と Android の両方のコード署名に必要な情報をアップロード
2. Slack の webhook を設定
3. 公開のための、Google Play や App Store Connect の詳細を入力

![publish.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/66c5770a-0f8f-950b-3e49-3680b727bd27.png)

これらに加えて、カスタムスクリプトを書いて、[Fabric](https://get.fabric.io/) や .[HockeyApp](https://hockeyapp.net/) などのサードパーティサービスにアーティファクトをデプロイすることもできます。

スクリプトの大きな力を利用して Codemagic でカスタムワークフローを設定し、アプリのビルドプロセスをより強固なものにできます。

# 多数のワークフロー

Codemagic では、異なる設定やバージョンのソフトウェアの要件を満たすために、多数のワークフローを作成できます。既存のワークフローを複製して名前を変更することで、新しいワークフローを作成できます。以下の手順です。

1. **App settings**に移動します。(訳注: [codemagic.io/apps](https://codemagic.io/apps/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang) ページで、それぞれのプロジェクトの歯車アイコンをクリックして移動できます)
2. **Workflow settings** セクションの、**Duplicate workflow** をクリックします。複製されたワークフローは、アプリ名の下の一覧に "Default Workflow (Copy)" として表示されます。ワークフローを選択し、名前を変更します。

![workflow_settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028491/1966a367-6a91-d668-b9a3-28b805ea5fc6.png)

上の画面では、デフォルトのワークフローの名前を "Custom Workflow" に変更しています。異なる Xcode のバージョンやデバッグ用設定やリリース用設定での Flutter アプリのテストなど、多くのワークフローを作成できます。

# まとめ

Codemagic は、Flutter アプリ専用の公式の CI/CD ソリューションとして始まりましたが、今ではすべてのモバイルプロジェクトをこの最速の CI/CD に迎え入れています。Codemagic のマジックを使えば、設定なしで Flutter アプリのビルド、テスト、公開ができますし、カスタムワークフローを使えば環境を制御してビルドを実行できます。Android ネイティブアプリ、iOS ネイティブアプリ、React Native アプリをお持ちの場合は、`codemagic.yaml` ファイルを使用するだけで、発進の準備が完了です！

ハッピー ビルディング！

# お役立ちリンクと参考文献

- [Codemagic の公式ドキュメンテーション](https://docs.codemagic.io/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)
- [Flutter Module をネイティブ Android アプリプロジェクトに追加して、 Codemagic でテストする方法](https://blog.codemagic.io/flutter-module-android-yaml/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)
- [Flutter Module をネイティブ iOS アプリプロジェクトに追加して、Codemagic でテストする方法](https://blog.codemagic.io/how-to-add-flutter-modules-to-native-ios-project-and-test-it-on-codemagic/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)
- [Flutter Module が追加されたネイティブ Android アプリを、 Codemagic を使用して配布する方法](https://blog.codemagic.io/distributing-module-yaml/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)
- [iOS のコード署名と公開を、 codemagic.yaml を使用して行う方法](https://blog.codemagic.io/distributing-native-ios-sdk-with-flutter-module-using-codemagic/?utm_source=qiita&utm_medium=referral&utm_campaign=flutter_distribution&utm_content=japanese_lang)

以上が翻訳です。

# お役立ち日本語記事へのリンク

[Codemagic で Flutter\(iOS & Android\)アプリを自動配信\-全体設定編 \| Medium](https://medium.com/@riscait/build-and-publish-a-flutter-app-with-codemagic-2fac4da0ebe9)

[Codemagic で Flutter\(iOS & Android\)アプリを自動配信\-Flavor 対応編 \| Medium](https://medium.com/@riscait/building-and-delivering-a-flavor-enabled-flutter-app-using-codemagic-5225a6070224)

[Codemagic で Flutter アプリのビルド・配信をする — iOS 編 \| by mono  \| Flutter 🇯🇵 \| Medium](https://medium.com/flutter-jp/codemagic-a0f494c6244a)

[【Mac 不要】開発中の Flutter 製アプリを iOS と Android に実機配備する手順 \- Codemagic 編 \- Qiita](https://qiita.com/kami_teru/items/c7ed113d0ecdf7e48ff0)