iOS/Android アプリ開発自動化ツール：fastlane 

## Fastlaneとは

iOS/Android のアプリ開発で必要な様々な作業を自動化してくれるツール
感動しすぎて泣けます。

https://fastlane.tools/

* ipa/apkの作成
* iTunesConnect/GoolePlayへのipa/apkのアップロード
* iTunesConnect/GoolePlayのメタデータの登録・更新
* テストの実行
* iOSProvisioningファイル/証明書の管理
* DeployGate/Testflightなどへのアップロード

---

## 設定
Fastfile と呼ばれる設定ファイルに ruby で記述する

```
lane :beta do
  increment_build_number
  cocoapods
  match
  testflight
  sh "./customScript.sh"
  slack
end
```

--- 

## 実行

```
fastlane beta
```
---

## actionについて

action が用意されていて、実行したい action を記載していく。主要な action は、 command として実行することも可能

```
bundle exec fastlane deliver
```

---

## commandについて
fastlane は、様々な command に細分化されている。 commandは独自に、実行可能だし、Fastfile に書いて実行することも可能.pemだけでも便利なのでまずはこれから使うというのもあり。

* **match**　cerやprovisiongの管理
* **gym** Project の build
* **deliver** ipa の iTunesへの配信
* **pem** 証明書の管理

---



## インストール
* ローカルにしれっと入れる

```
gem install fastalne
```

* CIでまわすために bundle でいれる

```
# Gemfile
gem 'fastlane'
# 実行
# --path はお好みで
bundle install --path vendor/bundler 
```

---

## 初期設定
以後、bundle 経由でインストールしたと仮定します。

```
bundle exec fastlane init
Your Apple ID (e.g. fastlane@krausefx.com):[appleIDを入力]
# 以後パスワードなどきかれるので、プロンプトどうりにいれていきます
```

--- 

## pem
Push 通知用の 証明書作成、設定などを一括でやってくれる。
泣ける！
```
bundle exec pem -a com.hoge.sampleapp1 -u hoge@apple.com
```

---

## match

証明書管理の新しいやりかた. DevCenter でぽちぽち管理するのではなく、github のレポジトリに配置して、
管理する。涙出る

```
bundle exec match init
```

```
bundle exec match appstore -a com.hoge.sampleapp1 -u hoge@apple.com
```

---

## match

iOSDevcenterある証明書を一旦すべて削除してから使うのがオススメ！
リリースしているアプリに影響はないよと document にも書いてます。

```
bundle exec match nuke
```

---

## deliver

iTunesConnect にアップロードするためのコマンド。バイナリだけではなく、metadataや screenshotsもアップロードできる。

```
bundle exec deliver
```

--- 

## deliver によるストア情報の管理

メタデータのダウンロード
```
bundle exec deliver download_metadata
```

![スクリーンショット 2017-03-03 16.47.12.png](https://qiita-image-store.s3.amazonaws.com/0/2273/045d4f26-b639-f978-002d-6c574641eb8d.png)

---

## deliver によるストア情報の管理
スクリーンショットのダウンロード

```
bundle exec deliver download_metadata
```

![スクリーンショット 2017-03-03 16.47.18.png](https://qiita-image-store.s3.amazonaws.com/0/2273/cdc5bb32-d23f-7e36-fdc0-b89462713c16.png)

---

## deliver によるストア情報の管理
* ダウンロードしたファイルを 編集して deliver すればOK
* git で管理できるので変更履歴も終えてサイコー

--- 
## deliverの細かなポイント
* ~~download_metadata で落としてきたファイルに app_icon があって、なぜか jpeg なので一旦削除しないと、deliver できません。~~ できるようになってました
* 複数の target を管理しないのであれば、Deliverfile にメタデータを書いてもOKです。

* deliver はデフォルトだと、アップする前に ブラウザが起動して、Store 情報の確認ができます。y/n をきかれるので、OKであれば y でアップされます。 この機能は,CI でまわすときには、不要なので、 deliver に force: true を渡せば 確認はされません。

--- 
## その他便利オプション

* --skip_metadata, --skip_screenshots, --skip_binary_upload などの便利な オプション

---

## 各種設定ファイルについて

Fastlaneには複数の機能がふくまれていて、一番重要な Fastfile 以外にも設定ファイルがたくさんできる。
（Appfile、Deliverfile、Fastfile、Matchfileなど）

--- 

## 各種設定ファイルについて (1/2)
ただし、設定ファイルは、各コマンドに何も指定しなかった時に使われる値、つまりデフォルト値程度の意味がなく、
各種機能のコマンドには、共通して上書きしたいオプションを渡せるようになっている。

--- 

## 渡せるオプションの例

```
# アプリID
-a com.hoge.sampleapp
# AppleID
-u hoge@apple.com
```

---

## CustomAction
```
bundle exec fastlane new_action
```

---

## CustomAction で使えるツール
```
Actions.sh("git status")
```
```
Fastlane::UI.user_error("message")
Fastlane::UI.success("message")
UI.important "Seems like launching fastlane takes a while - please run"
          UI.message ""
          UI.command "[sudo] gem cleanup"
          UI.message ""
          UI.important "to uninstall outdated gems and make fastlane launch faster"
          UI.important "Alternatively it's recommended to start using a Gemfile to lock your dependencies"
          UI.important "To get started with a Gemfile, run"
          UI.message ""
          UI.command "bundle init"
          UI.command "echo 'gem \"fastlane\"' >> Gemfile"
          UI.command "bundle install"
          UI.message ""
          UI.important "After creating the Gemfile and Gemfile.lock, commit those files into version control"
```

---
## Actionを直接実行

```
bundle exec fastlane run hoge_action
```

---



## ドキュメント
action に渡せる optionや commandに渡せるoption やその他の tips はdocumentを参照。
またなんやかんやソースコードを見るのがよい。わかりやすくて綺麗！

* [docs](https://docs.fastlane.tools/)
* [Githubのdocs](https://github.com/fastlane/fastlane/tree/master/fastlane/docs)
* [action一覧](https://github.com/fastlane/fastlane/tree/master/fastlane/lib/fastlane/actions)
* [example一覧] (https://github.com/fastlane/examples)

### AppStore(iOS) と GooglePlay(Android)開発 の自動化の比較
* Fastlaneは、そもそも iTunesConnect 用のツールなので、iTunesを自動化する方に注力されている
* GooglePlay では、新規アプリの作成はできない、screenshot の download はできない等の GooglePlayのAPIの制限による制限がある
* Androidアプリの開発は、gradle がついているので、自動化でやりたいことはそもそもなんでもできる。ただ、fastlaneのコマンドを共通化することで、開発をやりやすくすることはできる

---
## ios_deploy
* ios で、adb install/uninstall を行えるツール
* npm でいれる