iOSアプリのリリースフロー自動化ツールfastlaneの導入

# 背景
slackやdeploygate、circleciに意識を向けてると関連してよく耳にするfastlane。
名前は知っているが、いまいち何をしてくれるかがよくわかっていなかったので触りながらためしてみることにしました。

作業のゴールとしては、  

* XCテストの実行をfastlaneのコマンドから叩けるようにする
* IPAファイルをつくってデプロイゲートへアップロードすることができる

これらのゴールはそれ自体でみると大した効率化に見えないかもしれませんが、circleciとslackを組み合わせることで大幅な効率化を見込むことができると思います。
それらについては、後日追記する予定です。


# 公式ガイド

https://github.com/fastlane/fastlane/blob/master/docs/Guide.md

# インストール

## 前提
Mac OS 10.9 or newer
Ruby 2.0 or newer (ruby -v)
Xcode

## 作業

fastlineのインストール

```
sudo gem install fastlane --verbose
```
  

Xcodeのコマンドラインツールの最新版をインストール
※もし最新ではないなら

```
xcode-select --install
```
上記コマンドをターミナルで入力するとポップアップが表示されるので"インストール"をクリック

<img src="https://hunza.qiita.com/files/a72ec610-054e-9e60-73ca-27195fedddfa.png" width="350px">

fastlaneの実行に時間がかかる場合は以下のコマンド

```
gem cleanup
```

# セットアップ


* まずは自分のプロジェクトファイルにcd で移動

* ターミナルで以下のコマンド入力

```
fastlane init
```
実行すると以下を聞かれるので入力

```
Your Apple ID (e.g. fastlane@krausefx.com): 
```
→自分のAppleIDを入力

```
Password (for hogehoge@hmail.com): 
```
→appleIDのパスワード入力

```
Multiple teams found, please enter the number of the team you want to use: 
1) XXXXXXXXXX "Takashi Kudo" (Individual)
2) XXXXXXXXXX "hoge, Inc." (Company/Organization)
```
→　AppleIDが複数のアカウントに紐付いている場合は適切な方を選択 ※今回は1


```

+----------------+--------------------------------------------------------------------------+
|                                      Detected Values                                      |
+----------------+--------------------------------------------------------------------------+
| Apple ID       | hogehoge@hmail.com                                                       |
| App Name       | SampleProject20160205                                                    |
| App Identifier | tokyo.swift.SampleProject20160205                                        |
| Project        | /Users/tac/Desktop/SampleProject20160205/SampleProject20160205.xcodeproj |
+----------------+--------------------------------------------------------------------------+

[14:35:35]: This app identifier doesn't exist on iTunes Connect yet, it will be created for you
[14:35:35]: This app identifier doesn't exist on the Apple Developer Portal yet, it will be created for you
Please confirm the above values (y/n)
```
→itune Connectなどの設定がされていない場合は、自動で設定してくれるのでこれをうけいれるかどうかを選択。yesを選択してみる。

※ no を選択するとApp Idendifierを聞かれるので手動で入力します。


```
[14:36:25]: Created new file './fastlane/Appfile'. Edit it to manage your preferred app metadata information.
[14:36:25]: Creating the app on iTunes Connect and the Apple Developer Portal

+----------------+-----------------------------------+
|             Summary for produce 1.1.1              |
+----------------+-----------------------------------+
| username       | hogehog@gmail.com                 |
| app_identifier | tokyo.swift.SampleProject20160205 |
| app_name       | SampleProject20160205             |
| sku            | 1454650585                        |
| language       | English                           |
| skip_itc       | false                             |
| skip_devcenter | false                             |
| team_id        | 3XL44PTR2S                        |
+----------------+-----------------------------------+

[14:36:28]: Creating new app 'SampleProject20160205' on the Apple Dev Center
[14:36:29]: Created app 336BGKV7DM
[14:36:29]: Finished creating new app 'SampleProject20160205' on the Dev Center
[14:36:31]: Creating new app 'SampleProject20160205' on iTunes Connect
[14:36:33]: Successfully created new app 'SampleProject20160205' on iTunes Connect with ID 1081728442
[14:36:33]: Loading up 'deliver', this might take a few seconds
[14:36:33]: Login to iTunes Connect (hogehog@gmail.com)
[14:36:35]: Login successful

+--------------------+-----------------------------------+
|                 deliver 1.9.0 Summary                  |
+--------------------+-----------------------------------+
| username           | hogehoge@hmail.com                |
| app_identifier     | tokyo.swift.SampleProject20160205 |
| metadata_path      | ./fastlane/metadata               |
| screenshots_path   | ./fastlane/screenshots            |
| skip_binary_upload | false                             |
| skip_screenshots   | false                             |
| skip_metadata      | false                             |
| force              | false                             |
| submit_for_review  | false                             |
| automatic_release  | false                             |
+--------------------+-----------------------------------+

[14:36:36]: Writing to 'fastlane/metadata/en-US/description.txt'
[14:36:36]: Writing to 'fastlane/metadata/en-US/keywords.txt'
[14:36:36]: Writing to 'fastlane/metadata/en-US/release_notes.txt'
[14:36:36]: Writing to 'fastlane/metadata/en-US/support_url.txt'
[14:36:36]: Writing to 'fastlane/metadata/en-US/marketing_url.txt'
[14:36:36]: Writing to 'fastlane/metadata/en-US/name.txt'
[14:36:36]: Writing to 'fastlane/metadata/en-US/privacy_url.txt'
[14:36:36]: Writing to 'fastlane/metadata/copyright.txt'
[14:36:36]: Writing to 'fastlane/metadata/primary_category.txt'
[14:36:36]: Writing to 'fastlane/metadata/secondary_category.txt'
[14:36:36]: Writing to 'fastlane/metadata/primary_first_sub_category.txt'
[14:36:36]: Writing to 'fastlane/metadata/primary_second_sub_category.txt'
[14:36:36]: Writing to 'fastlane/metadata/secondary_first_sub_category.txt'
[14:36:36]: Writing to 'fastlane/metadata/secondary_second_sub_category.txt'
Successfully created new configuration files.
[14:36:36]: Downloading all existing screenshots...
[14:36:37]: Successfully downloaded all existing screenshots
[14:36:37]: Successfully created new Deliverfile at path 'fastlane/Deliverfile'
[14:36:37]: xcrun xcodebuild -list -project './SampleProject20160205.xcodeproj'
[14:36:37]: 'snapshot' not enabled.
[14:36:37]: 'cocoapods' not enabled.
[14:36:37]: 'carthage' not enabled.
[14:36:37]: Created new file './fastlane/Fastfile'. Edit it to manage your own deployment lanes.
[14:36:37]: fastlane will send the number of errors for each action to
[14:36:37]: https://github.com/fastlane/enhancer to detect integration issues
[14:36:37]: No sensitive/private information will be uploaded
[14:36:37]: You can disable this by adding `opt_out_usage` to your Fastfile
[14:36:37]: Successfully finished setting up fastlane

```

セットアップ完了！

# 実行
以下の項目は具体的には、Fastfileに処理を書いた上でline で定義したコマンドをたたくことで実行されます。

## XCTestの自動化

* Fastfileに書く内容(簡易版)

```
 desc "XCTestのを実行します。"
    lane :test do
      xctest(
        scheme: "SampleProject2016020_2",
        destination: "platform=iOS Simulator,name=iPhone 5s,OS=9.2",
      )
  end
```


* コマンド

```
fastlane test
```

プロジェクトフォルダ > fastlane > test_output > report.html をクリックするとこんな感じでXCTestの実行結果が表示されます。

<img width="1000px" alt="Test_Results___xcpretty.png" src="https://hunza.qiita.com/files/580c1deb-0f1c-0958-1286-6f1fdab70d3f.png">

より詳細に記載する例

```
  # Run tests in given simulator
  xctest(
    destination: "name=iPhone 5s,OS=8.1",
    destination_timeout: 120, # increase device/simulator timeout, usually used on slow CI boxes
    reports: [{
      report: 'html',
      output: './build-dir/test-report.html',  # will use XCODE_BUILD_PATH/report, if output is not provided
      screenshots: 1
    },
    {
      report: 'junit',
      output: './build-dir/test-report.xml'
    }]
  )
```



## IPAファイルをつくってデプロイゲートへアップロード

DeployGateのAPIの情報は[こちら](https://deploygate.com/docs/api)

念のためですが、以下だと失敗します。

* Fastfileに書く内容(失敗版)

```
desc "社内向け配信"
   lane :for_inhouse do
    sigh(
      adhoc: true
    )
    ipa(
      scheme: 'SampleProject2016020_2',
      configuration: 'Debug'
    )
    deploygate(
      user: 'hogehoge',
      api_token: 'hogehoge'
    )
  end
```

```

[18:24:58]: A build error occured. You are using legacy `shenzhen` for building
[18:24:58]: it is recommended to upgrade to `gym`: 
[18:24:58]: https://github.com/fastlane/gym
[18:24:58]: krausefx-ipa build -s "SampleProject2016020_2" -c "AdHoc" -m "/Users/tac/Desktop/SampleProject2016020_2/AdHoc_tokyo.swift.SampleProject2016020-2.mobileprovision" --verbose | xcpretty
[18:24:58]: -------------------------------------------------------
[18:24:58]: Variable Dump:
[18:24:58]: {:DEFAULT_PLATFORM=>:i
```
上のipaコマンドはshenzhenをビルドにつかってるんですが、それがうまくいっていないので、
https://github.com/fastlane/gym
からgymをインストール

```
sudo gem install gym
```

先ほどのをipaからgymに変更


* Fastfileに書く内容(簡易版)

```
desc "社内向け配信"
   lane :for_inhouse do
    sigh(
      adhoc: true
    )
    ipa(
      scheme: 'SampleProject2016020_2',
      configuration: 'Debug'
    )
    deploygate(
      user: 'hogehoge',
      api_token: 'hogehoge'
    )
  end
```

これで、deploygateにipaファイルがアップデートされます。
ちなみに、api_tokenはdeploygateのサイトにログインして確認することができます。

## fastlane の設定tips


[ここに](https://github.com/fastlane/fastlane/blob/master/docs/Actions.md)fastlaneのアクションとして、Fastfileに書く内容はまとまっています。

# 参考文献

http://qiita.com/gin0606/items/162d756dfda7b84e97d4