Bitrise で Flutter アプリの CI/CD 環境を構築する（初心者向け）

## はじめに

こんにちは。 Flutter でアプリ開発をしている [やまたつ](https://twitter.com/yamatatsu109_ja) と申します！
本記事は Bitrise で CI/CD を初めて構築する方に向けた記事です。

Bitrise を触ったことがない方や、CI/CD を構築してみたい方が、この記事を見て構築できるようになれれば嬉しいです！
今回、Bitriseを使って CI/CD を構築しましたが、とても使いやすく、すぐに配布まで行うことができました。

画像を使って、解説していきたいと思います。
最終的に Bitriseでビルドした Android アプリをメールで受信し、Android端末にインストールすることができるようになります。

![CleanShot 2021-08-15 at 15.33.20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/e70940b0-c620-b127-e41f-6be547d46b02.gif)

※誤った情報などありましたら、ぜひアドバイスいただけると助かります

---


以前、 iOS アプリ(Swift製)の CI/CD の構築を Bitrise で行い、記事を書きましたので、お時間ある方は合わせて読むと理解が深まるかと思います。

https://qiita.com/yamatatsu10969/items/b37d7ed2b26127e76879

CI/CD について理解を深めるときにこの記事が参考になりました。

https://www.redhat.com/ja/topics/devops/what-is-ci-cd

---

## Bitrise について

https://devcenter.bitrise.io/jp/

> Bitriseはモバイルアプリ開発（iOS, Android, Xamarin, …）における継続的インテグレーション・デリバリー（CI/CD） プラットフォームをサービス（PaaS）として提供しています。ソフトウェアプロジェクトの開発・自動化を手助けするためのツール・サービスの集合体です。

モバイルアプリに特化した CI/CD サービスです。
上記のドキュメントには Bitrise でできることが日本語で書かれています。
日本語でドキュメントが書かれているサービスはとっつきやすいですね！

(追記： 2021/08/24)
無料プランでは、300分のビルドと、5つのビルドまで並列実行できるようです！
1つのビルドで90分まで実行できるのでタイムアウトもなさそうですね。

https://www.bitrise.io/pricing


## 本記事のゴール

以下のことができるようになります。

- Bitrise を使って CI/CD を構築
- 指定したメールアドレスに apkファイル（Android） を配布

本記事では簡単のため、アプリの証明書を使用しません。

(追記： 2021/08/24)
- 証明書を使用して iOSアプリを配布


## 環境

Bitrise のアカウントと、 Flutter　アプリのソースコードを管理している GitHub リポジトリがある前提です。


Bitrise のアカウントはこちらから作成できます。

https://app.bitrise.io/referral/bc3c609d8d14fa45

#### 使用するリポジトリとブランチ

リポジトリ : `ci_cd`
ブランチ : `not_setup_firebase`
ソースコードは flutter create で作成されたときのままです。静的解析と、fvm だけ追加しています。

https://github.com/yamatatsu10969/ci_cd/tree/not_setup_firebase

---

#### Flutter

Flutter SDK 2.2.1 を使用しています。
(リポジトリでは [fvm](https://github.com/leoafarias/fvm) を使ってバージョン管理をしています)

`flutter doctor` の結果

```
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel unknown, 2.2.1, on macOS 11.5 20G71 darwin-x64, locale en-JP)
[!] Android toolchain - develop for Android devices (Android SDK version 30.0.2)
    ✗ Android license status unknown.
      Run `flutter doctor --android-licenses` to accept the SDK licenses.
      See https://flutter.dev/docs/get-started/install/macos#android-setup for more details.
[✓] Xcode - develop for iOS and macOS
[✓] Chrome - develop for the web
[✓] Android Studio (version 4.2)
[✓] IntelliJ IDEA Ultimate Edition (version 2019.2.1)
[✓] VS Code (version 1.59.0)
[✓] Connected device (1 available)

! Doctor found issues in 1 category.
```

## Bitrise を使用した CI/CD の構築


### 最初のワークフローの作成

Bitrise のWebサイトから作成するので、 `Add New App on web UI` を選択します。

![CleanShot 2021-08-15 at 09.56.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/9125ea55-cca9-6c77-ce17-4b7ec0aa937b.png)

---

アカウントを選択し、プライバシー設定を行います。
今回は、Public で行っていますが、外部に設定を見せたくない場合や、重要なファイルをアップロードしている場合、必ず **Private** で行ってください。（分からない場合は Private を選択してください）
public にするとビルドのログを外部から見ることができるので、情報漏洩に繋がります。

![CleanShot 2021-08-15 at 10.01.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/338d902a-7418-cc6e-64f9-46e728947fdc.png)

---

CI/CD を構築するリポジトリを選択します。
GitHub 以外にも、Bitbucket, Gitlab, 手動でリポジトリを選択できるようです。

![CleanShot 2021-08-15 at 10.03.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/9827395e-062c-53c7-11f0-4b358e09bf6c.png)

---

public を設定しているので SSH は設定しなくていいですが、 **Private** を選択している場合、設定が必要です。

![CleanShot 2021-08-15 at 09.58.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/441d965e-bfb2-c766-6459-4dd9630dbbef.png)

---

SSH の設定方法は以下のリンクから確認することができます。

https://devcenter.bitrise.io/jp/getting-started/index/#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B

---

ここでセットアップを押すと、少し時間がかかってセットアップが終わります。

![CleanShot 2021-08-15 at 10.12.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/3147fb4d-afed-0829-15e9-32bfc89726d2.png)

---

プロジェクトの設定です。 ここは no で構いません。
今回、 iOS のビルドは行わないのでどれを選んでも大丈夫です。
Confirm で完了です！

![CleanShot 2021-08-15 at 10.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/8fd0d716-90c8-9c29-0eb2-4c3e92fcdd5a.png)

![CleanShot 2021-08-15 at 10.14.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/e437edbc-d6ba-12de-cf21-15d93b60e719.png)

![CleanShot 2021-08-15 at 10.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/66eb83f8-da80-9fe8-2f7b-a0e6160756d8.png)

---

webhook のセットアップはしなくてOKです。
雲みたいなアイコンのところが黄緑になるので、そこを押下すると最初のビルドが始まります。

![CleanShot 2021-08-15 at 10.16.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/cd9712a1-11c0-b7dd-8c16-d22f3ed014fa.png)

---

最初のビルドが走り始めました！！！はやい👏

![CleanShot 2021-08-15 at 10.17.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/26bf9ba0-a926-5c37-7bf6-feb726525e36.png)

---

しかも成功している！！！ 
※開発で使用している Flutter SDK が `1系` の場合、失敗するかもしれません

![CleanShot 2021-08-15 at 10.18.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/dc50ddc0-7471-ece0-cd54-d4750d1e2257.png)

---

## ワークフローの設定と確認


それでは、実行されているワークフローを確認してみましょう。
以下のようにワークフローが作成されています。ぽちぽちしていくだけでこんなにすぐワークフローが完成するのは素晴らしいですね！
`Flutter Analyze` と `Flutter　Test` が行われているので、 コードの品質を保つワークフローはすでにあるようです。
しかし、 `Flutter build` は行われていないので、設定していきましょう！

![CleanShot 2021-08-15 at 10.23.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/b48d639d-a366-0634-03a5-cae7e19923c3.png)


---

### Flutter build の設定

テストが終わったタイミングでビルドしたいので、 Flutter Test の下のプラスボタンを押しましょう。

![CleanShot 2021-08-15 at 10.35.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/ebb53b0c-a601-6ce8-6d0e-c7e5a9a5ba94.png)

---

検索窓に `Flutter` と入力すると `Flutter Build` があるので選択します。

![CleanShot 2021-08-15 at 10.35.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/caef4eda-2dca-1a2a-eacc-da617dd3b596.png)

---


今回は証明書無しで Android アプリの配布を行います。
証明書無しでは ipa ファイル（iOSアプリ）は作成できません。(.appファイルは作成できますが、インストールが不便なので使用しません)
そのため、 `Platform` を `both` から `android` に変更しましょう。
`both` だと両方ビルドできるので、とても便利そうです！ 
その分ビルド時間も伸びるので最初は片方のOSで構築して、後で両OSに設定すると時短になると思います。（エラーの原因がどちらのOSかがすぐに特定できるため）


![CleanShot 2021-08-15 at 11.46.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/25d06b1c-8b31-a5c6-f255-140dd183d625.png)

---

Android Platform Configs を確認してみましょう。
ビルドされたアプリの拡張子を選択できます。apk が選択されていることを確認しましょう（デフォルトです）
Bitrise で便利だと感じるのが、ワークフローの一つ一つにアウトプットされる変数が記載されている点です。
`$BITRISE_APK_PATH` に、 apk ファイルがアウトプットされていることがわかります。
スクリプトを組むときに、どの変数を使用すれば良いかがすぐにわかります。

![CleanShot 2021-08-15 at 11.54.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/179319c4-dfd5-3273-b631-c023abbcc270.png)

---

### Flutter install の設定

話が前後しますが、 `Flutter Install` の設定を確認します。
 `Flutter SDK` のバージョンが `stable` になっているので、 ローカルで開発している環境と合わせましょう。
私の場合は、 `2.2.1` に変更します。

![CleanShot 2021-08-15 at 13.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/c539ce29-6ecc-48e6-0e06-4aa2563bd894.png)

---

### 通知の設定

ここまでで Flutter の設定は完了です！
自分のメールアドレスに apk ファイルを送りたいので設定していきます。

`Deploy to Bitrise io` を選択しましょう。 `Notify: Emails` に入力したメールアドレスに送信してくれるようです。

今回はアプリの設定を public にしているため、メールアドレスを直接入力するのではなく、 シークレット変数を使用します。
センシティブな情報は必ずシークレット変数を使用するようにしましょう。
今までの設定を保存するために、 `cmd + S` か、 保存するボタンを押しましょう。

![CleanShot 2021-08-15 at 13.16.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/05eaa00e-d9f2-5fda-cf14-6823a53baac9.png)

---

上のタブの Secrets のタブを選択し、左に変数名、右にメールアドレスを入力しましょう。
保存した後に、 Edit を選択し、 `Make it protected` を選択すると、後で編集を押した時に変数が表示されることがなくなります。
public なところや、変数をみられたくない環境では `Make it protected` を活用しましょう。

![CleanShot 2021-08-15 at 13.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/dfb713ad-7d4c-0b0d-2eba-1f6a06b875ce.png)

---

画像のように Edit を押した後に `Make it protected` を選択することができます。(こちらは例です。使用しません)

![CleanShot 2021-08-15 at 13.01.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/87a79448-4169-903d-37bc-6e5f0a320037.png)

---

通知設定は以下で完了です。

![CleanShot 2021-08-15 at 13.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/d0850ea1-5a9b-f8c3-ee94-94322353d0b2.png)


ついに設定が完了しました！
ワークフローの設定を保存して、ビルドしてみましょう！

---

### 設定したワークフローを実行

アプリのルートに移動し、 画像の順番でボタンを押し、正しいブランチに設定されているか確認し、ビルドをスタートします。

![CleanShot 2021-08-15 at 16.02.07@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/8bddff5f-d30a-4e7f-10b2-4152d7610bba.png)

---

### 実行結果

#### Bitrise のビルド結果

Success！！！ 一番テンションが上がる瞬間です。

![CleanShot 2021-08-15 at 13.08.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/ace65ae1-f428-e70f-3e5f-5d603043c1ec.png)

---

ビルドの詳細から apk ファイルをダウンロードすることができます。

![CleanShot 2021-08-15 at 15.38.19@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/0ae35768-3780-0b59-3b99-4ca82413bb77.png)

---

#### メール通知

自分のメールアドレスにちゃんと届いていました！

![CleanShot 2021-08-15 at 15.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/ffa25cf7-17bb-d5f9-0262-b6db3a317501.png)

---

メールからアプリのインストール、実行までです。
配布されたアプリが動くと感動しますね！🎉
※アプリがすでにインストールされている場合は、アンインストールしてから行わないとインストールできませんでした。となります。

※再掲載
![CleanShot 2021-08-15 at 15.33.20.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/e70940b0-c620-b127-e41f-6be547d46b02.gif)

---

## iOSアプリの配布(追記： 2021/08/24)

#### 前提

- Apple Developer Program に登録しており証明書を持っている、または発行できる
- 証明書のアップロードの仕方がわかる

使用するブランチ `feature/signing`

証明書についてはこちらがわかりやすいです。

https://qiita.com/yosshi4486/items/7dbd7e2bc35a1fc9e5a0

### iOS での配布方法

#### 証明書の作成

1. 配布用の Provisioning Profile を作成
    1. Apple Developer Program へ行って Profiles を開く
    1. + を押して新しいProfileを作成
    1. 用途にあった Provisioning Profile を選択(Ad Hocを選択しました)
    1. App ID を選択（ない場合は Identifiers で作成する）
    1. Distribution を選択
    1. 作成完了
    1. Provisioning Profile をダウンロード 
1. Keychain から p12 ファイルを作成
    1. 以下の画像を右クリックして export を選択
    1. 作成完了

 ![CleanShot 2021-08-24 at 19.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/f882a11f-ccee-a4cf-0cbe-4ca2d0a8f48e.png)

### Xcode での設定

`Automatically manage signing` のチェックをはずして、Provisioning Profile を選択。

![CleanShot 2021-08-24 at 19.49.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/9e77e07b-dc4b-9706-4c7e-e1e44bb43cc5.png)

その後に、任意のブランチに変更を push します。

### Bitrise での設定

#### 証明書のアップロード

以下のように、作成した証明書をアップロードします。
上が Provisioning Profile で、下が p12 のファイルです。

![CleanShot 2021-08-24 at 19.52.25@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/ec91f827-114b-ac27-855e-0d704440f440.png)

#### ワークフロー

`Certificate and profile installer` と `Xcode Archive & Export for iOS` を追加します。

![CleanShot 2021-08-24 at 19.55.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/32975306-a87d-70b6-64b5-7ed6a053491c.png)

`Xcode Archive & Export for iOS` を編集します。
`The Developer Portal team to use for this export` の中に証明書に記載されている team ID を入力しましょう。


![CleanShot 2021-08-24 at 20.08.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/ebf57d3c-d576-c9b5-65fc-c4d1c67b90cb.png)

![CleanShot 2021-08-24 at 20.09.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/fad6118c-5eac-3fd6-3ae9-2c9f865652cc.png)

これで設定は終わりなのでビルドしましょう！


### ipa ファイルをメールで取得でき、インストール！

![CleanShot 2021-08-24 at 20.04.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/bec12e36-51bd-f730-68e6-b920b4a2b975.png)

Bitrise の Profile をインストールする作業が必要です。

![CleanShot 2021-08-24 at 20.03.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/a6fbd869-321c-8107-ece5-c53bf664f545.png)

![CleanShot 2021-08-24 at 20.03.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/38ee9edd-fcbb-bacd-ec14-9a1062a13fa0.png)

今回はマニュアルで設定しましたが、Auto Provisioning を使用したい方はこちらが参考になるかと思います。

https://devcenter.bitrise.io/jp/code-signing/ios-code-signing/ios-auto-provisioning/



## さいごに

Bitrise を使用して、Flutter アプリの CI/CD の構築が簡単にできることがわかりました。
Bitrise は日本語のドキュメントがあり、とっつきやすいので、ぜひ利用してみてください。

さらに Bitrise には、 AppStoreConnect や GooglePlay へのアップロードや、TestFlight や DeployGate を使用した配布、 Slack への通知などとても便利な機能がたくさんあります。
自分の環境に適した CI/CD を構築して、無駄な作業をなくしていきましょう！

業務で配布する場合は、 DeployGate や Firebase Distribution を用いると便利です。(iOS のテスト端末のUDIDを集めるのが楽になります)

この記事をきっかけに CI/CD の理解が深まると嬉しいです。
参考になった方は LGTM👍 を押していただけると励みになります。

ここまで読んでいただきありがとうございました！
ぜひ CI/CD の構築にチャレンジしてみましょう！

---

## 参考

https://blog.bitrise.io/post/quick-guide-to-flutter-on-bitrise-jp


こちらが今回作成したワークフローのビルド結果です。

https://app.bitrise.io/app/9ccea6e0db39ad44#