爆速でFlutterアプリをTestFlightに投げる環境のつくりかた


# 想定読者
* 毎週何個もアプリをデプロイする忙しいPoC屋
* 単に今時のデプロイ環境を学びたい人

# 方針
* アプリのコードを書き始める前に、まず**fastlane環境の構築からTestFlightアップロード**までをやる
* **デプロイ**が先！**コード**があと！

# 前提/検証環境
* Mac OSX Catarlina
* いい感じのバージョンの`Xcode`インストール済
* `Homebrew`インストール済み 
  * [公式ドキュメント](https://brew.sh/index_ja)を参照  
* `fastlane match`用のリポジトリが作成済
  * まだ作ってない人は [@kotarella1110](https://qiita.com/kotarella1110) さんの [こちらの記事](https://qiita.com/kotarella1110/items/840af2cf80aaea1fb035) がおすすめ！

### マシンで1度だけやればOKな手順
1. Homebrewのパッケージをインストール
* `direnv`環境の構築
* `fastlane`用に`.envrc`ファイルの作成

### アプリ毎にやる手順
1. flutterプロジェクト作成
* `fastlane init`でfastlane/AppFileを生成
* `fastlane match`でプロビジョニングプロファイルの生成
* Xcodeでプロビジョニングプロファイルを指定


# マシンで1度だけやればOKな手順
## 1. Homebrewでパッケージのインストール
* コマンドラインで入れるのは二流っぽいので今時は`Brewfile`を置いて`brew bundle`

```
$ brew tap Homebrew/bundle
$ touch Brewfile
$ (いい感じのエディタコマンド) Brewfile
```

```
# Brewfile

brew "direnv"
brew "fastlane"
brew "cocoapods"
```
というBrewfileを置いて

```bash

$ brew bundle
```

## 2. direnv環境を構築
* パスワードとかデリケートな情報をうっかりお漏らししないように、かつ毎回入力するのはしんどいので`direnv`を使ってそれらをディレクトリ毎に指定できる環境変数に追い出すようにする。
* すでにBrewfileからdirenv自体はインストール済みなので設定を実施
 
```bash
# bashの人は.bashrcに読み替えて
$ echo 'eval "$(direnv hook $SHELL)"' >> ~/.zshrc 
```

## 3. fastlane用に.envrcファイルの作成
* `.envrc`にそのフォルダでだけ使える環境変数を閉じ込める
* 超セキュアな情報なのでコミットしないように注意
  
```
$ touch .envrc
$ (いいかんじのエディタコマンド) .envrc
```

```
# .envrc

export FASTLANE_PASSWORD=｛AppleIDのパスワード}
export MATCH_USERNAME={AppleID(メールアドレス)}
export PRODUCE_USERNAME={同上}
export MATCH_PASSWORD={fastlane matchのパスワード(リポジトリを複合するためのパス)}
export MATCH_GIT_URL={fastlane match用ファイルが置いてあるgitのURL(だいたいGitHub)}
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD={後述}
```

#### 注：FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORDについて
[このURL](https://appleid.apple.com/account/manage)の「**App用パスワード**」から生成したパスワードを入れる。
これがないと、TestFlightにアップロードする時に二段階認証くらったりする

### 1. アプリ毎にやる手順

## 1. flutterプロジェクト作成
* `flutter create`なり`Android Studio`で新規作成
* マシン毎の手順3で作った`.evnrc`をコピーしてきて`direvn allow`。
  * 尚、書き換えるたびに実行する必要がある。

```bash

$ flutter create {アプリ名}
$ cd {アプリ名}
$ cp ~/.envrc ./   # .evnrcをどっかから持ってくる
$ direnv allow     # 忘れずに
```

## 2. fastlane initでfastlane/AppFileを生成
```bash
$ cd ios
$ fastlane init -u $MATCH_USERNAME
```

* `fastlane initの`実態は[fastlane produce](https://docs.fastlane.tools/actions/produce/)
* 2回アプリ名を聞かれるが、1度目は`Dev Center`へ登録するアプリ名。
* 2度目の質問は`iTunes Connect`への登録名。2度目の名前は**世界で唯一**である必要があるので注意。


## 3. fastlane matchでプロビジョニングプロファイルの生成
 
```bash
$ fastlane match appstore
$ fastlane match development
```
* **TIPS:** testFlightに飛ばすだけならappstoreだけやれば良い。実機実行のためのにdevelopmentが必要。
* **TIPS:** `fastlane match init`は`.evnrc`の環境変数に全部書いてあるので不要

## 4. Xcodeでプロビジョニングプロファイルを指定
* プロジェクト設定のSigining Capabilityのタブ（下記画像）
  * **Automatically manage signingのチェックを外す**
  * `debug`には`match Development〜`のプロビジョニングプロファイルを指定
  * `release`には`match AppStore〜`のプロビジョニングプロファイルを指定

<img width="640" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26446/144e3452-72b5-37b3-4a3f-876c68ac4e41.png" />



# デプロイの時間だ！

```
$ fastlane beta
```

# 結論
* 全然爆速じゃない。手間かかりすぎ。


# 補足:どうしてcocoapods/fastlaneをHomebrewからインストールするのか？
* `fastlane`や`cocoapods`自体のバージョンは、外部の環境に依存しているので、Gemfile/Gemfile.lock等でバージョンを固定することは、他の端末でcheckout＆buildをするときにトラブルの原因になりやすい。
  * 同様に`aws-cli`や`firebase-cli`もHomebrew(Brewfile)のほうが良いと考えている
* トラブった場合、brew upgradeで解決するほうが筋が良さそう