FastlaneでiOSアプリの審査提出を自動化する

Carview Advent Calender 2日目の記事を担当しますnbappsです。
1日目の@zwtinくんが[いい記事](https://qiita.com/zwtin/items/6a8cb5ce6a393ee0918e)を書いてハードルを上げてくれたので、ハードルを下げる役を担いたいと思ってます。
## 本題

アプリの審査提出って地味に時間がかかりますよね。
ビルドして、アップロードして、ストアから選択して、リリースノート書いて、提出して。。
作業と待ち時間が交互に繰り返されるので全部終わるまで地味に時間がかかります。

この記事ではそんな課題を解決すべく、「**Macのターミナルでコマンドを一つ打つだけで、ビルドして審査提出までしてくれる**」ところまでを解説します。

Fastlaneとは、「iOS/Androidアプリのリリースに関わるあれこれを自動化してくれる」便利なライブラリで、証明書やプロビジョニングプロファイルの更新、ベータ配布、テスト、ビルドバージョン管理などもFastlaneで自動化できます。
Fastlane 公式 : https://docs.fastlane.tools/



## 検証環境
* Mac OS - 10.15.7 〜 11.0.1
* Ruby - 2.6.3 （2.6.0だとfastlaneインストール失敗しました）
* Fastlane - 2.166.0

## セットアップ
さっそくですが、導入手順を説明します。
### 1. CommandLine Toolをインストール
```
$ xcode-select --install
$ sudo xcode-select --reset
```
CommandLineツールはiOS開発者ならインストール済みの方も多いと思います。
`--reset`を行うのは以下記事と同じエラーに遭遇したので念のためです。
https://qiita.com/tototti/items/52e19efcb2e3a22484d9

### 2. Rubyのバージョン確認
```
$ ruby -v
```
Rubyのバージョンが2.6.3未満の場合はfastlaneのインストールに失敗したので、以下の手順でrbenvをインストールしてruby2.6.3をインストールしておきます。

```
$ brew install rbenv ruby-build
$ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile 
$ rbenv install 2.6.3
$ rbenv global 2.6.3
```
ここで、一度ターミナルを再起動してrbenvの設定を反映します。

### 3. Fastlaneをインストール
プロジェクトフォルダにて、以下を実行しGemfileを生成します

```
$ bundle init
```
`Gemfile`が生成されるので、末尾に`gem 'fastlane'`を追加します

```ruby:Gemfile
source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem 'fastlane' # ここを追加
```             
Gemfileの指定内容に沿ってfastlaneをインストールします。

```
$ sudo gem update --system
$ bundle install --path vendor/bundle
```
これでFastlaneがインストールできました。

### 4. Fastlaneの初期設定
続いてFastlaneの初期設定を行います。
対象のプロジェクトフォルダ内にて以下を実行しFastfileを生成します。

```
$ fastlane init
```
実行するといろいろ質問されるので素直に答えます。

```
# 何を自動化したいか聞かれる （今回は審査提出なので3を選択）
> What would you like to use fastlane for?
> 1. 📸  Automate screenshots
> 2. 👩‍✈️  Automate beta distribution to TestFlight
> 3. 🚀  Automate App Store distribution
> 4. 🛠  Manual setup - manually setup your project to automate your tasks
→ {3を選択}

# iOSプロジェクトにSchemeが複数ある場合は審査提出用のスキームを聞かれる
> Select Scheme: 
> 1. myproject-release
> 2. myproject-staging
> 3. myproject-development
→ {1を選択}

# Appleアカウントを聞かれる
> Please enter your Apple ID developer credentials
> Apple ID Username:
→ {Appleアカウントを入力}
> Password (for aaaa@bbbb.com):
→ {パスワードを入力}

# 2要素認証のコードを入力
> Please enter the 6 digit code:
→ {******}

# ストアの掲載情報をファイル管理するかどうか
> Would you like fastlane to manage your app's metadata? (y/n)
 → {yesを選択} 
（Appsotoreの掲載情報を全てファイル管理でき、今のストアの情報を元にmetadataを作ってくれる）

```
質問の内容はXcodeのプロジェクトファイルから自動でカスタマイズされているようです。

Fastlane、賢い・・・。

全て完了すると`./fastlane`フォルダ内に`Fastfile`が生成されています。

## Fastfileとは
`Fastfile`とは、fastlaneで行うビルド、審査提出、といった処理の順番を指定する設定ファイルのことで、`lane`と呼ばれるメソッドの中に実行すべき処理が書かれています。
ちなみにRubyで書かれているので、IF文などはRubyの文法がそのまま使えます。
以下が、セットアップで自動生成された`Fastfile`です

```ruby:fastlane/Fastfile
platform :ios do
  desc "Push a new release build to the App Store"
  # この中に処理を書く
  lane :release do
    # ビルド番号を自動でインクリメント
    increment_build_number(xcodeproj: "myproject.xcodeproj")
    # ビルドしてipaを生成
    build_app(workspace: "myproject.xcworkspace", scheme: "myproject-release") 
    # 審査提出
    upload_to_app_store 
  end
end
```

build_appやupload_to_app_storeのパラメータを指定することでカスタマイズが可能です。
パラメータ一覧はFastlaneの公式ドキュメントから確認できます。
・[build_app](https://docs.fastlane.tools/actions/build_app/#parameters)
・[upload_to_app_store](http://docs.fastlane.tools/actions/upload_to_app_store/#parameters)


## 審査提出
審査提出時は以下のコマンドを叩くだけでOKです。
ビルドが開始され、AppStoreへのアップロードまでやってくれます。

```
$ bundle exec fastlane release
```
`release`の部分がFastlileのlane名に対応しており、独自のlaneを作成した際はここを書き換えて呼び出せます。

注意点としてはXcodeのBuildSettingsからProvisioningProfileの設定でAdHoc用のプロビジョニングプロファイルを設定していると、ビルド時にエラーになるため、AppStore用のプロビジョニングを設定しておく必要があります。
 
## あとがき
Fastlaneをセットアップして審査提出のコマンドを叩くところまでを解説しました。
ここまで比較的少ないステップで構築できるので、導入のコスパはいいのではないかと思います。

カービューではこのFastlaneのコマンドを叩く部分を`CircleCI`というCIサービス上で行っています。
サーバー上の外部のマシンに証明書やProvisioninProfileをインストールする必要がありますが、これもFastlaneの`match`という機能で自動で管理してくれます。
また、ベータ配布や自動テストも`CircleCI`上で同時に行っていて、Gitプッシュするだけで、`ビルド`→`ベータ配布`→`自動テスト`→`審査提出`を行える環境となっています。

今回、これらの解説は長くなるので割愛しましたが、証明書の管理方法や、ベータ配布、自動テストツールについてもまた機会があればご紹介したいと思います。

最後までお読みいただき、ありがとうございました。
次回はいつも服からベロが出ているデザイナーの@yamaberoさんがJavascriptのTipsを紹介してくれるようです。