fastlaneを導入してビルドを楽にする


iOSでアプリを開発しています。
アーカイブの時間が馬鹿にならなくなってきました。
アーカイブをしてオーガナイザーからiTunesConnectへのアップロードをXcodeからすると、30分から1時間ほどかかってしまっています。
これではいくら時間が合っても足りません。

しかも、アーカイブやiTunesConnectへアプリのバイナリファイルをアップロードする間、Xcodeの処理が重くなり、開発がストップしてしまいます。

なんとかしないと。

ということでiOSアプリのビルドツールfastlaneを導入することにしました。
これを入れるとコマンド１つでアーカイブとiTunesConnectへの提出をしてくれるようになります。

今回はCocoaPodsを使ったプロジェクトにfastlaneを適応していきたいと思います。


# 環境

* macOS 10.12.5 (Sierra)
* Xcode 8.3.2
* fastlane 2.32.1
* cocoapod 1.2.1


# fastlaneをインストールする

プロジェクトのディレクトリ`(**.xcworkspace or **.xcodeproj)`で行います。
下記のコマンドでGemfileを作ります。編集します。

```bash
$ bundle init
$ vim Gemfile 
```

Gemfileにfastlaneとcocoapodsを追加します。
cocoapodsを入れるのは、fastlaneからcocoapodsを使えるようにするためです。

```ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
gem "fastlane"
gem "cocoapods"

```

パス指定でGemをインストールします。

```bash
$ bundle install --path vendor/bundler
```


# fastlaneの初期設定
fastlaneの初期設定を下記のコマンドで行います。

```bash
$ bundle exec fastlane init

```

いろいろ聞かれます。答えていきます。
自分のApple IDを聞かれるので登録しているEメールを入力します。

```bash
.
.
.
[22:20:42]: Your Apple ID (e.g. fastlane@krausefx.com): 
```

二段階認証が不要なApple IDならパスワードを入力を求められます。入力します。
(登録メールをexample@gmail.comと仮定しています)

```bash
Password (for example@gmail.com): 
```

アプリのBundle Identifierを求められます。入力します。

```bash
App Identifier (com.krausefx.app): 
```

iTunes Connectとデベロッパーポータルで自分のアプリをアップするかどうかを求められます。今回はiTunes Connectへアプリをアップしたいので`y`を入力しました。

```bash
 Would you like to create your app on iTunes Connect and the Developer Portal? (y/n)
```

これでfastlaneが必要ファイルを作成してくれます。

# 生成されたfastlaneディレクトリ

`$ bundle exec fastlane init`が成功するとカレントディレクトリにfastlaneディレクトリが作成されています。
ディレクトリ構成は以下の通り。

```bash
fastlane
├── Appfile 
├── Deliverfile
├── Fastfile 
├── README.md
├── metadata
├── report.xml
└── screenshots

```

# Fastfileを見る
Fastfileを見てみます。

```ruby:Fastfile
fastlane_version "2.32.1"

default_platform :ios

platform :ios do
  before_all do
    # ENV["SLACK_URL"] = "https://hooks.slack.com/services/..."
    cocoapods
  end

  desc "Runs all the tests"
  lane :test do
    scan
  end

  desc "Submit a new Beta Build to Apple TestFlight"
  desc "This will also make sure the profile is up to date"
  lane :beta do
    # match(type: "appstore") # more information: https://codesigning.guide
    gym(scheme: "egcall") # Build your app - more options available
    pilot

    # sh "your_script.sh"
    # You can also use other beta testing services here (run `fastlane actions`)
  end

  desc "Deploy a new version to the App Store"
  lane :release do
    # match(type: "appstore")
    # snapshot
    gym(scheme: "egcall") # Build your app - more options available
    deliver(force: true)
    # frameit
  end

  # You can define as many lanes as you want

  after_all do |lane|
    # This block is called, only if the executed lane was successful

    # slack(
    #   message: "Successfully deployed new App Update."
    # )
  end

  error do |lane, exception|
    # slack(
    #   message: exception.message,
    #   success: false
    # )
  end
end


```

# アーカイブしたらビルドナンバーをインクルメントする
自動で作成されたFastfileでほぼほぼいいんですが、アーカイブするたびにビルドナンバーをインクルメントしたいと思います。
これをしないと同じビルドナンバーiTunes Connectは拒否するので手動でXcodeのプロジェクト設定のGeneralから書き換えなくてはいけなくなりとても面倒です。

スクリプトからビルドナンバーをインクルメントするにはXcodeの設定が必要です。

プロジェクトの該当ターゲット>Build Settings > VersioningからVersioning SystemをApple Genericに変更します。
またCurrent Projetct Versionに現在のビルドナンバーを記入します。


![number.png](https://qiita-image-store.s3.amazonaws.com/0/31587/f9922e8b-f33e-9134-17da-d02ce00df838.png "number.png")

FastFileのreleaseレーンにincrement_build_numberを追加します。

```ruby:FastFile
  desc "Deploy a new version to the App Store"
  lane :release do
    # match(type: "appstore")
    # snapshot
    increment_build_number#追加
    gym(scheme: "egcall") # Build your app - more options available
    deliver(force: true)
    # frameit
  end


```

# Fastlaneを実行
Fastlaneを実行します。

```bash
$ bundle exec fastlane release
```

上手く行けばアーカイブとiTUnes Connectへのアップロードをfastlaneがしてくれます。



# 参考

* [[iOS] fastlaneの導入](http://qiita.com/touyu/items/7ea0d2d666716ffb5e96)
* [fastlane で build/version number をインクリメントする](http://qiita.com/takecian/items/1b33c8dcb26db70e917e)
* [Technical Q&A QA1827 Automating Version and Build Numbers Using agvtool](https://developer.apple.com/library/content/qa/qa1827/_index.html)