fastlaneでまず始めに使いたいアクション

# はじめに
本記事は[Volare Advent Calendar 2019](https://qiita.com/advent-calendar/2019/volare)の3記事目として書いています。
私は今年の4月から社会人として、主にiOSアプリの開発を行っていますが、今回はVolare卒業1期生(?)として寄稿させていただきます！

fastlaneの導入方法やリリースの自動化などについては、既にたくさんの記事があるので、
今回はアプリの個人開発を行っている方や、今までfastlaneを知らなかった方でも恩恵を受けられそうな、3つのfastlaneのアクションについて、その挙動や実行方法などをまとめたいと思います。

# fastlaneとは
[fastlane](https://fastlane.tools/)は、iOS及びAndroidアプリのビルドやリリースを自動化してくれる、ビルドツールです。
**無料**で使用することができ、OSSでドキュメントも整備されているため、手軽に導入できます。
**無料**です。

Fastfileにlaneと呼ばれるアクションの組み合わせを記述し、CUI上やCIツールなどから実行することで、様々な処理を自動化することができます。
今回はこのアクションについて、特に便利でよく使いそうなアクションを挙げていきたいと思います。

# アクション
## gym
![gym.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198029/5dd4be28-8797-0c5f-f883-04627571e88b.png)
(引用:https://docs.fastlane.tools/actions/gym/)

:muscle: :muscle: :muscle: 

**[gymアクション](https://docs.fastlane.tools/actions/gym/)**は、アプリのビルドと、ストア申請やTestFlightへのアップロードのために必要な、ipaファイルの作成を行えます。
これ、XCodeからやるとめちゃくちゃ時間かかりますよね… 

### パラメータ
gymアクションには公式ドキュメントにあるように、様々なパラメータを渡すことができます。
私は主に、

| キー名      |      役割 |    設定値   |
|:-----------------|------------------|:------------------|
| scheme             |      アプリのスキームを指定する|   "[アプリ名]"      |
| configuration           | アプリをビルドする際の構成を指定する| "Release" or "Debug"|
| outpu-name       |   ipaファイルの書き出し名を指定する | "[アプリ名].ipa" |

の3つを指定しています。

```
gym(
  scheme: "MyApp",
  configuration: "Release",
  output_name: "MyApp.ipa"
)
```

このような感じですね。

## pilot
![pilot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198029/ed95deb8-4287-38be-34e2-81bdf81ddcbc.png)
(引用: https://docs.fastlane.tools/actions/pilot/)

:rocket: :rocket: :rocket: 

**[pilotアクション](https://docs.fastlane.tools/actions/pilot/)**は、AppleのTestFlightにアプリをアップロードしたり、テスターに配布したり、テスターの管理などができます。

### テスターの追加・削除
テスターを追加したい場合は、CUI上で

```
fastlane pilot add [追加したいテスターのemailアドレス] 
```
と打つことで実行可能です。同様に削除したい場合も、

```
fastlane pilot remove [削除したいテスターのemailアドレス]
```
のコマンドを実行するだけで、対象のテスターを綺麗サッパリ消すことが可能です。

### ベータ版の配布
パラメータでipaファイルを指定し、pilotアクションを実行するだけでTestFlightへのアップロードまで行えます。

```
pilot(
  ipa: "./MyApp.ipa"
)
```

## deliver
![deliver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198029/5ccc6fb7-a0ae-bccd-726f-fd274d988a64.png)

(引用:https://docs.fastlane.tools/actions/deliver/)

:bicyclist: :bicyclist: :bicyclist: ← UberEats

**[deliverアクション](https://docs.fastlane.tools/actions/deliver/)**はアプリのリリースを自動化してくれるアクションです。XCodeを使わずに、新しい.ipaファイルをApp Store Connectにアップロードすることが可能です。
その際にprefetch機能が実行されることで、アプリがリジェクトされる危険性を含んでいないかを、事前にある程度確認もしてくれます。

### 関連ファイル
App Storeへのアプリの提出には、スクリーンショットやリリースノート、アプリの説明文など様々な要素が必要となります。
そしてfastlaneは、これらのファイルもまとめて管理することができます。
具体的には、
```./fastlane/screenshots```以下でスクリーンショットを
```./fastlane/metadata/ja/release_notes.txt```でリリースノートを
```./fastlane/metadata/ja/description.txt```でアプリ概要の文章をそれぞれ変更、修正できます。

### パラメータ
他のアクションと同様に、deliverアクションにも様々なパラメータを渡すことができます。
特に使用頻度の高そうなものとしては、

| キー名   |  役割   |  設定値 |
|:----------------|------------------|:------------------|
| force  | アプリ申請時のHTMLレポートファイルの検証をスキップ |true|
|submit_for_review|   アプリのアップロード後、審査用に新しい新しいバージョンを送信|true|
|automatic_release  | アプリの審査通過後、自動的にリリースする|true|
等が挙げられます。実際に書くと、

```
deliver(
  force: true,
  submit_for_review: true,
  automatic_release: true
)
```
のような形ですね。

# いざ実行
実際にこれらのアクションを使用する場合、CUI上で1つずつコマンドを叩いてもよいのですが、多くの場合Fastfileにレーンを作って、実行します。
**レーン**とは、複数のアクションを組み合わせたものです。
```lane [:レーンの名前] do ```と```end```の間に実行したいアクションを書いていきます。

具体例を示すと、

``` Fastfile. 
lane :testFlight do
    # ビルド
    gym(
      scheme: "MyApp",
      configuration: "Release",
      output_name: "MyApp.ipa",
    )
    # TestFlightへアップロード
    pilot(
      ipa: "./MyApp.ipa"   
    )
  end

 
  lane :release do
    # ビルド
    gym(
      scheme: "MyApp",
      configuration: "Release",
      output_name: "MyApp.ipa",
    )
    # App Store Connectへアプリ提出, リリース
    deliver(
      force: true,
      submit_for_review: true,
      automatic_release: true
    )
  end
```

のような形になります。

あとは、ベータ版の配布を行う場合は
```bundle exec fastlane testFlight```
アプリのリリースを行う場合は
```bundle exec fastlane release```
のように、作成したレーンを指定したコマンドをCUI上で実行すれば、自動化が行なえます。 

# おわりに
今回はfastlaneでまず始めに使いたいアクションとして、
- gym
- pilot
- deliver
の3つを挙げ、それぞれのアクションの動作と実行方法を軽くまとめてみました。

fastlaneにはこれらのアクションの他にも、証明書やプロファイルを生成、同期、管理できる**[match](https://docs.fastlane.tools/actions/match/)**、**[pem](https://docs.fastlane.tools/actions/pem/)**、**[cert](https://docs.fastlane.tools/actions/cert/)**といったアクションや、テストを自動化できる**[scan](https://docs.fastlane.tools/actions/scan/)**、スクリーンショットを自動生成することができる**[snapshot](https://docs.fastlane.tools/actions/snapshot/)**など、まだまだたくさんのアクションが用意されています。

この記事をきっかけにアプリ開発の自動化について興味を持ってくださった方は、ぜひ公式ドキュメントなどを参考に、他のアクションも使ってみてください！

# 参考
[fastlane公式](https://docs.fastlane.tools/)
[fastlaneを導入する手順について](https://dev.classmethod.jp/smartphone/iphone/prepare-for-ios-app-distribution-part-2/)
[fastlaneを使ってみる](https://qiita.com/masashi-sutou/items/5aa17f3d439b19562b18)
[これから始めるfastlane](https://qiita.com/econa77/items/d81a392d6b195cfb7316)