FlutterでCI(Codemagic編)

以下の記事の続きです。

[FlutterでCI(Github Action編)](https://qiita.com/kasa_le/items/d57ca63f19db0b352790)
[FlutterでCI(CircleCI編)](https://qiita.com/kasa_le/items/4390cc172e167dd28014)


予告通り、CodemagicでCIをやってみようと思います。

# 1.Sign Up

アカウントを作るには、以下のいずれかのGitリポジトリサービスのアカウントが必要です。

- Github
- Bitbucket
- GitLab

ここではGithubでやってみます。
(Bitbucketもprivateリポジトリ用にアカウント持ってるけど、Githubがprivateも無料になったからもはや使ってないなー)

## (1)サインアップ開始
サインアップはこちらから。

Codemagic
https://codemagic.io/start/

|![codemagic_start.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/cbb8f435-8d63-4eaf-a08d-9e87ec52768c.png)|
|:--|


[Start now]をクリックします。

## (2)リポジトリサービスの選択

|![codemagic_signup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/aacea746-d3c9-c605-dfe1-9d9c54554bf7.png)|
|:--|

利用規約に同意するチェックボックスをチェックした後、持っているアカウントに合わせてボタンをクリックします。
私の場合、Githubです。

Githubの権限を許可するか聞かれるので、内容を確認して、[Authorize NevercodeHQ]をクリック。

|![codemagic_auth_github.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/3e5647d4-62d4-f285-35ed-efbec7ff7e4a.png)|
|:--|

# 2.最初のビルド

リポジトリ一覧画面が表示されるので、対象のリポジトリを選んで、[Start your first build]をクリック。

|![codemagic_select_repo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/a32f6451-9d96-2ad0-952f-6798b73c0126.png)|
|:--|

とりあえず、そのまま[Strt new build]してみましょう。私の場合、masterブランチではビルドできない状態なので、developブランチをこの後の画面で選びました。

|![codemagic_new_build.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/78d502c9-acf7-3298-58ad-98dc2dbc8db3.png)|
|:--|

ビルド中の画面です。

|![codemagic_firstbuild.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/091f30e4-0d5d-8c95-ce19-77fdd577780e.png)|
|:--|

なんかAndroid/iOS以外にもいろいろとビルドしようとしてますね。何が出来るのかな？？
と思っていましたが、Web用のビルド設定がされてないので、単にスキップされました。

で、結果として、Artifactsに以下のファイルが出来ました。

|![codemagic_artifacts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/536d6609-7a87-d5b7-22ca-8b4d39e61c31.png)|
|:--|

apkが2個出来てるのはよく分からないけど、未署名のreleaseビルドと、署名済みdebugビルドかな？
Runner.appはiOS用でしょうが、デバイスに入れられる設定(開発者登録すら住所を署名する書類を要求されて止まってますw)をしてないので、今は何も出来ません。

# 3.ビルド設定をする

Codemagicでのビルド設定は、基本的にブラウザ上のGUIで行っていきます。スクリプトも勿論書けます。ちょっとJenkinsに近いですかね。
YAMLでも書けるようですが、いったんブラウザから設定するだけにしてみます。

## (1)Build triggers
ビルドのトリガーを設定できます。
ここでは、いい加減masterブランチでビルドできるようにする意味もあって、masterブランチにマージしようと思っていたところなので、**masterブランチをtargetとしたpull request**という設定にしてみました。

|![codemagic_build_triggers.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/604b4ba5-635e-2baa-13dd-90f7ad412306.png)|
|:--|

|![codemagic_build_triggers_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/c768e20b-9cf7-d84c-8b59-90aa4611fd45.png)|
|:--|

[Save]をクリックします。

## (2)Environment variables
環境変数の設定ですね。
今は不要なのでおいておきます。
(Slack通知に色々設定するのも不要です！後述します)

## (3)Dependency caching
依存関係のキャッシュを有効に出来るみたいです。便利ですね！
ただ、私の場合、masterブランチでのビルドを考えているので、ここはキャッシュしないで常にクリーンな環境を作ってビルドすることを想定としたく、キャッシュはしないことにしました。
テストをバンバン回す運用の場合は、キャッシュを有効にした方が良いでしょうね。

## (4)Test

Testの設定は次のようにしました。エミュレーターテストはまだ書いてないですが、一応Android emulatorにしておきました。別にiOSでもいいですけどね。

|![codemagic_test_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/10f0a205-1068-d9e0-5d26-a6e243fed678.png)|
|:--|

他のCIツールで、テスト結果レポートをhtmlにするとか、xmlにするとか、いろいろ拡張機能を入れてやりましたが、Codemagicの場合、**不要です**!!
というのも、testコマンドは、デフォルトで`test --machine`になっているようで、その出力`json`を解析して独自に結果レポートを出してくれます。
今までの苦労はいったい・・・という状況ですが、とりあえず、何も追加の設定不要です。有り難いですね。

## (5)Build
ここがいちばんありがたいところでしょうか。
Flutterのバージョン等がリストから選べます。これは便利！

私の場合、**Flutter version**と**Xcode version**を自分の環境に合わせました。どちらもLatestにしても通りましたが、一応自分の環境に合わせておくのが良いでしょうね。

|![codemagic_build_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/c6e96709-4a56-818d-a257-936f42bf3576.png)|
|:--|

**Mode**はapk等のビルドモードでしょう。テストがメインの時は**Debug**にしておいて良いかと思います。

[Save]をクリックするのをお忘れなく！

## (6)Publish

署名なんかの設定も出来ちゃいます。凄い！
まだ使いませんけど・・・
CDまでお任せでやれちゃいそうで、これは期待大ですね。
まだやりませんけど(笑)

ここでは、Slack通知だけ設定をやっておきます。

### Email通知
そのまえに、Email通知は、私の場合、ちょっとうざいのでOFFにしておきます。

|![codemagic_disable_email.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/79dd398a-a82a-1f0c-288c-a19ac842f656.png)|
|:--|

もし、社内で必要な人にdebug用のアプリファイルをメールで配布したいとかある場合には、**Add recipients**にメールアドレスと入れてあげれば良いようですね。

### Slack通知

Slack通知も、なんとも簡単に設定できます。
自分でWebhookを作ってUrlをSecretsに入れて・・・なんてやらなくて良いんです！
びっくり。

最初は*disabled*になっているので、[Slack]の部分をクリックして以下の画面を表示させます。

|![codemagic_slack_connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/01ec02cb-fafc-3694-9727-0e5345ed5ebb.png)|
|:--|

[Connect Slack]をクリックすると、以下のようにSlackの認可ページが表示されます。

|![codemagic_slack_auth.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/035dbfe4-722f-28e0-c9ef-7e21ca40b9b8.png)|
|:--|

問題なければ、[許可する]をクリックしましょう。
上部の「Slackはこのアプリをまだ検証あるいは承認していません〜〜」が気になりますが、目を瞑ってクリックしました。
気になる人は、やめておきましょう^^;

ここで、Codemagicにリダイレクトで戻るのですが、私の場合、真っ黒なページになってしまいました(汗)
仕方ないのでTopから入り直してもう一度AppSettingsに行かなければなりませんでした。

で、もう一度[Slack]の部分を表示させると、次のような表示になります。
チャンネルを選ぶくらいですかね。あとのオプションは任意で。

|![codemagic_slack_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/e2fa0d70-805c-1548-7229-39f0856bdeda.png)|
|:--|

とりあえず、テスト失敗したらビルドは止めて欲しいのでそこのチェックはしていません。

最後に[Save]してね！！

これ以降の設定は今は不要なのでdisabledのままにしておきます。
リリース出来るタイミングになってCDが必要になったときにまた見直すことにします。

# 4.プルリクビルド

PR(プルリク)でビルドがトリガーされるか確認します。

## (1)PR作成
Github上で、developからmasterへのPRを作成しました。

|![github_pr_create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/706e4a22-65ae-b792-def3-76f69bea2193.png)|
|:--|

Codemagicのビルドがちゃんとスタートしました。

|![codemagic_pr_triggerd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/adb9e932-05a2-4274-6171-ec9c5f42ce12.png)|
|:--|

## (2)ビルド終了
ビルドが終わると、GithubのPRページがこうなっていました。

|![github_pr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/52b7ef97-9004-c97a-2d69-652f01d957ce.png)|
|:--|

Github Actionsは、[あの設定](https://qiita.com/kasa_le/items/d57ca63f19db0b352790)だと、テストが失敗していてもエラーになってないですね・・・(アカン)

CircleCI、CodemagicはちゃんとFailになっています。

## (3)テスト結果レポート
Codemagicのテスト結果レポートを見てみます。

|![codemagic_test_results.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/d2377466-8d02-cc96-0b23-3500ea2f310b.png)|
|:--|

テストが失敗したメソッドが分かります。失敗内容も分かりますが、ファイル名や行数までは出ないようです。というかこれは、`--machine`オプションで出力される`json`の方の問題のようですね。

テストを修正して、pushすると、もう一度同じワークフローがビルドされます。
成功後、GithubのPRページはこうなっていました。

|![github_pr_check_passed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/d702eae7-eae5-6048-f105-c65f04629e4c.png)|
|:--|

# 5.Slack通知

失敗したときの通知です。

|![slack_post_codemagic_ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/ea26a9b0-f921-3cae-9f5d-261c30c6d835.png)|
|:--|

テストを修正して、成功したときの通知です。

|![slack_post_codemagic_ok.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/50e0c550-5d36-1f19-d94c-c779460b0671.png)|
|:--|

自分で色々と細かい設定をせずに、通知もかなり分かりやすく届きます。
**Artifacts**としてapkなども貼られるているのもかなり便利そうです。

# 6.その他

## (1)ステータスバッジ
ステータスバッジは、ワークフロー設定ページの右側に表示されています。
[Badge markdown]のコードをコピーしてREADME等に貼りましょう。

![status_badge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/afc90ffc-8070-c949-3635-9318c972b419.png)


## (2)ワークフローを追加する
ワークフロー設定ページの右側に、[Duplicate workflow]というリンクがあります。
これをクリックすると、ワークフローをコピーして作ることが出来ます。

![duplicate_workflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103886/27830323-c8dd-11f6-862d-4b81f4b7800d.png)


## (3)ビルドスキップ用コメント

CircleCI等と同じく、コミットコメントでビルドをスキップできます。

https://docs.codemagic.io/building/automatic-build-triggering/#skipping-builds

>If you do not wish Codemagic to build a particular commit, include [skip ci] or [ci skip] in your commit message.

とのことなので、`[skip ci]`か`[ci skip]`をコメントに含めれば良いようです。

# 7.感想
凄く使いやすいですね。
Android単独でもビルドできそうな感じ？
~~そちらも出来るのであれば、~~ (※今現在出来ないみたいです。[無理矢理Flutterモジュールを入れたアプリにするトリック](https://blog.codemagic.io/flutter-module-android-yaml/)は紹介されています)

- 開発中のテストは別のCIツール
- masterPRに対するテストとデプロイはCodemagic

なんて使い分けをすれば、複数アプリの開発が並行していても、ビルド数がそこまでネックにならずにやりやすいかもしれませんね。

ちなみに、Flutterのビルド、以下のような早さで終わるようです。

CircleCI > Github Acitons > Codemagic

CircleCIとGithub Acitonsは、OSイメージの差でしょうか。CircleCIはUbuntu、Github ActionsはmacOSにしているので。Codemagicはアプリファイルのビルドまでしているので、当然ですね。
エミュレーターテストをしないのであれば、Ubuntuで十分なので、こんな使い分けもいいかも知れません。

- UnitTest, Firebase TestLab
  - CircleCI
- エミュレーターテスト
  - Github Actions
- CD
  - Codemagic

色々使ってかえって分かりづらいか(^^;
まとめたければ、Codemagic一択でしょうかねえ。