fastlane - 自動化されたアプリ配備


<img width="773" alt="Screen Shot 2018-10-26 at 10.39.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/36b57043-5d32-1a41-04e2-e7f08481ce3f.png">

```
https://docs.fastlane.tools/

```
Fastlane is a set of tools that helps to automate tedious tasks and quickly deploy an application from the console. Once it is set up, the simple command `fastlane release` in the terminal will  **automatically**  capture screenshots, build the application, upload it to the app store and notify slack. 
If you create different lanes, you can also create beta versions or test versions with simple `fastlane` commands as well. 
Fastlaneは、面倒なタスクを自動化し、コンソールからアプリケーションをすばやく展開するための一連のツールです。設定が出来たら、ターミナルの中に簡単な`fastlane release`コマンドで、fastlaneが **自動** でスクリーンショットを取って、アプリをビルドして、アプストーアにアップロードして、slackにお知らせしてくれます。
他のlaneを作ったら、リリースだけじゃなくてベーターやテストなどすぐに出来上がれます。

```ruby
lane :beta do
  increment_build_number    # ビルドバーション上げる
  build_app
  upload_to_test
end

lane :release do
  capture_screenshots
  build_app
  upload_to_app_store       # iTunesアップストアにアップロードする
  slack                     # slack 知らせする
end
```
The above code shows how you can create separate lanes for deploying a beta application and releasing a full build.
上記のコードは、ベータアプリケーションを展開してビルドをリリースするための別々のlaneを作成する方法を示しています。
___
#Installing fastlane - インストール
You will need input most fastlane commands into the terminal.
Firstly, xcode is required, so it would be good to install or update to the latest version. 
fastlaneのコマンドはほとんどターミナルに入力しなければなりません。
まず、xcodeが必要なので、最新バージョンをインストールかアップデートしたほうがいいです。

```
xcode-select --install
```
Install fastlane with the following command, you can install with RubyGems or Homebrew.
下のコマンドでfastlaneをインストールが出来ます。RobyGemsかHomebrewどちも使えます。

```ruby
# Install with RubyGems でインストールする
sudo gem install fastlane -NV

# Install with Homebrew でインストールする
brew cask install fastlane
```
Once it is installed, navigate to your application workspace and run fastlane with the initiate command.
 ( iOS: if you want to have your fastfile written in Swift, use the `fastlane init swift` command instead. )

インストールしたら、アプリのパスでfastlaneの開始するコマンドを使ってください。
（iOS：fastfileをSwiftで欲しいなら、`fastlane init` の代わりに`fastlane init swift`を使ってください。）

```
cd ~/workspace/android/application/project_folder
fastlane init
```
Initiating fastlane will automatically detect the project file which you are in and create fastfiles accordingly to your Android or iOS application. Once it is installed, you should be able to run some of the simple commands such as: `fastlane test`, `fastlane beta` and `fastlane deploy`. However, depending on if you are running it with android or ios, you will have to complete the next parts differently.
Extra note: if you have installed fastlane with RubyGems, you can launch fastlane much faster by using `bundle exec`. After installing, you may need to go through the files inside of `/fastlane/...` to correct any information with your current build that might be incorrect.

Fastlaneを開始すると自動でAndroidとiOSの`fastfiles`が作ります。インストールの後はすぐに`fastlane test`、`fastlane beta`と`fastlane deploy`が使えるはずです。しかし、次の部分はandroidとiosのする事は別々になります。
追加メモ：RubyGemsでfastlaneをインストールした場合、 `bundle exec`を使ったらfastlaneはもっと速く起動することができます。インストール終わったら、`/fastlane/...`の中にあるファイルの情報確認したほうがいいかもしりません。app-identifierなどが間違えてないを確認。

``` ruby
WARNING: fastlane requires your locale to be set to UTF-8. To learn more go to https://docs.fastlane.tools/getting-started/ios/setup/#set-up-environment-variables
```
If you have the warning above, please put in the following into the terminal. 
上記の警告がある場合は、端末に以下を入れてください。

```ruby
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
```
___
# iOS
## Testing fastlane 
Now that fastlane has been installed and initiated, we should run a few tests before getting fastlane to Deploy applications for us. Inside of the `fastlane/Fastfile` file, you can adjust or create different lanes for fastlane to take. Essentially requesting fastlane to complete a different set of commands depending on console command you provide it.
アプリをDeployする前に、ちょっとテストと準備しなければならない。`fastlane/Fastfile`ファイルの中に、色な「lane」と言うが作れます。レインを作ったら、コマンドラインで自分の作った道を有働してくれます。本質的に、fastlaneがコンソールコマンドに応じて異なるコマンドセットを完了するように要求します。

```ruby
lane :tests do
  run_tests(scheme: "MyAppTests")
end
```
Putting this lane inside of the `Fastfile` would allow you to run the `fastlane tests` command to complete the requested actions. You can add additional parameters to run the test with extra conditions, such as testing on certain devices or even testing without building.
`Fastfile`にこのレインを入れて、`fastlane tests`のコマンドで入れたらテストします。テストの中にも他のparametersも入れられます。特別条件とか入れてテストも出来ます。

```ruby
lane :tests do
  run_tests(workspace: "Example.xcworkspace",
            devices: ["iPhone 6s", "iPad Air"],
            scheme: "MyAppTests")
end
```
You can find a list of all the other parameters here:
https://docs.fastlane.tools/actions/run_tests/#parameters

```ruby
lane :tests do
  run_tests(scheme: "MyAppTests",
            slack_url: "https://cloverlab.slack.com/services/my_name_is_dylan",
            slack_channel: "#channel")
end
```
Example to send messages to slack. スラックに知らせを送るの例。

## Running fastlane - fastlaneの実行
Now that we have tested and gotten some things moving, let's try to execute some of the fastlane functions, such as the auto generation of screenshots and beta application deployment. 
テストが出来ているので、fastlaneのフンクションちょっと実装して展開までやってみましょう。
1. Screenshots - スクリーンショット
2. Beta Deployment - ベータ展開
3. AppStore Deployment - アップストア展開

### 1. Capture Screenshots Automatically - 自動でスクリーンショットを撮る
To set up capturing screenshots automatically, we need to create a UI Test target using Xcode. By doing this, we can automate and debug issues using Swift or Objective-C. There is no need to touch Javascript.
自動スクリーンショットの設定は「Xcode」で「UI Test target」を作らなければならない。これを使うのはデバッグが全部SwiftとObjective-Cで出来ます。Javascriptは必要じゃありません。

<img width="706" alt="Screen Shot 2018-10-25 at 12.13.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/98fcb691-b093-b69d-8536-4b2a0963c6de.png">

<img width="575" alt="Screen Shot 2018-10-25 at 12.14.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/98eb35b6-4d2f-9b16-4e24-e9d4635c4774.png">

Once Xcode has been set up, try running `fastlane snapshot init` in the terminal. It will generate a `./SnapshotHelper.swift` file inside your workspace which you can add to your 'UI Test target'. After creating a scheme, build and run your target. For Objective-C users, you must add `#import "MYUITests-Swift.h` to the class. 
Xcodeの設定して、`fastlane snapshot init` を使ってみてください。`./SnapshotHelper./swift`ファイルが作ってくれる、このファイルを「UI Test target」に追加してください。Objective-C使う場はクラスのへーダーに`#import "MYUITests-Swift.h`が必要です。

To take screenshots at certain locations, call the function: 特に「xxx」の画面にスクリーンショット入れば：
 **Swift:**  `snapshot("01LoginScreen")`
 **Objective-C:**  `[Snapshot snapshot:@"01LoginScreen" timeWaitingForIdle:10];`

Inside of your `setUp()` method, add the following: `setUp()`のメソッドこの下を追加してください：
 **Swift:** 

```swift
let app = XCUIApplication()
setupSnapshot(app)
app.launch()
```
 **Objective-C** 

```objective-c
XCUIApplication *app = [[XCUIApplication alloc] init];
[Snapshot setupSnapshot:app];
[app launch];
```

This will be all the set up you need to do. To capture all the screenshots, input `fastlane snapshot` into the terminal. You can check all the screenshots inside `/fastlane/screenshots`. If they are okay, you can upload them to the AppStore with `fastlane deliver`.
これは設定以上になります。スクリーンショットを撮りたかったら、ターミナルに`fastlane snapshot`を入れてください。`/fastlane/screenshots`が作ってくれます。そこでスクリーンショットを確認が出来ます。アップストアにアップロードしたかったら、`fastlane deliver`で出来ます。

### 2. Building Beta Application - ベーターアプリをビルドする
To create a beta for your application, inside of the `Fastfile` you will need to declare a new path for the beta verision.
アプリのベーターバーションを作りたかったら、`Fastfile`の中にベーターレインを作らなきゃあかん。新しい「path」を作りましょう。

```ruby
lane :beta do
  get_certificates           # invokes cert
  get_provisioning_profile   # invokes sigh
  build_app(scheme: "MyApp")
  upload_to_testflight
  slack(message: "Successfully distributed a new beta build")
end
```
OR for more options:

```ruby
lane :beta do
  get_certificates           # invokes cert
  get_provisioning_profile   # invokes sigh
  build_app(scheme: "MyApp",
            workspace: "Example.xcworkspace",
            include_bitcode: true)
  upload_to_testflight
  slack(message: "Successfully distributed a new beta build")
end
```
Using `get_certificates` and `get_provisioning_profile` will help you with to 'sign' your application. Fastlane will then build your application and `upload_to_testflight` will upload your application to the AppStore. The `slack(...` function will notify slack on completion of the previous functions.
`get_certificates`と`get_provisioning_profile`はアプリを「sign」してくれます。`upload_to_testflight`はアップストアにアップロードしてくれます。そして`slack`がお知らせしてくれます。
### 3.AppStore Deployment (Release) - アップストア展開
To release the application, similarly to deploying a 'beta version' we will have to create a path to `release` the application. Once it is created, you can release your application with the `fastlane release` command.
アプリをリリースするのはベーターと同じように作れます。新しい`release`レインを作らなければなりません。設定が終わったら、リリースするのはターミナルに`fastlane release`を使いだけです。

```ruby 
lane :release do
  capture_screenshots                  # generate new screenshots for the App Store
  sync_code_signing(type: "appstore")  # see code signing guide for more information
  build_app(scheme: "MyApp")
  upload_to_app_store                  # upload your app to App Store Connect
  slack(message: "Successfully uploaded a new App Store build")
end
```
___
# Android
## Setting up Supply - Fastlane Supply を設定する
Unlike the iOS, GooglePlay cannot login and have everything set up automatically through the console. Google Credentials are required to collect and upload information to the GooglePlay Store. This information can be found in the [Google Play Console](https://play.google.com/apps/publish/). Let's create the link to Google Play.
GooglePlayはコンソルでログインして設定してくれませんので、自分でGoogleCredentialsを繋げなければなりません。全部の情報が「[Google Play コンソル](https://play.google.com/apps/publish/)」であります。この設定をやりましょう。
### Creating a service account - サービスアカウントを作り
First we will have to access the [Google Play Console](https://play.google.com/apps/publish/)'s 'API Access' inside of the 'Settings' to create a 'Service Account'. 
まずは [Google Play Console](https://play.google.com/apps/publish/)の設定の「API access」で　「Service Account」を作ってください。

<img width="503" alt="Screen Shot 2018-10-25 at 14.30.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/f2ed57ae-d7af-fb29-616a-9403b0ca2992.png">
---
<img width="1006" alt="Screen Shot 2018-10-25 at 14.36.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/1e252738-72df-f505-e1c5-0e2a052afd06.png">
---
<img width="657" alt="Screen Shot 2018-10-25 at 14.41.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/28bc00f8-51aa-01d4-4312-dbd891ec84ad.png">
---
<img width="1354" alt="Screen Shot 2018-10-25 at 14.46.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/4dedbeae-61bd-2881-55f9-c700c37a311a.png">
---
On Step 2, set Role as ‘Service Account User’
ステップ２、ロールは’Service Account User’に設定して

---
<img width="1397" alt="Screen Shot 2018-10-25 at 14.49.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/8847bad7-d515-0448-7895-68c74bc8be9e.png">
On Step 3, Add a new JSON key, this will download a new file to your computer.
ステップ３に新しいJSONキーを作ってください、これしたらJSONファイルがダウンロード始まるはずです。

Go back to the [Google Play Console](https://play.google.com/apps/publish/).
[Google Play コンソル](https://play.google.com/apps/publish/)に戻ってください。

<img width="942" alt="Screen Shot 2018-10-25 at 14.57.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/304410/4b805d22-eb4a-fa0b-dadb-fd278127d893.png">

The newly created account should be inside of this list. Under the Permissions column, press on 'GRANT ACCESS'. You will need to add 'Release Manager' to the Roles before we can configure our supply to fastlane.
このリストの中に先の作ったアカウントがあるはずです。'Permissions'のカルムの下に'GRANT ACCESS'のボットンがあるはず、それを押して、'Role'「ロール」の中に'Release Manager'を追加してください。これしたら、fastlaneにsupplyを繋ぎましょう。

### Configure Supply to fastlane
Now that you have the JSON file, you will edit the `fastlane/Appfile` file and set the path of `json_key_file` to the downloaded JSON file.
JSON fileダウンロードした後に、`fastlane/Appfile`を更新しましょう。`json_key_file`のところが先のダウンロードしたJSONファイルに入れてください。

```
json_key_file "/ダウンロード/した/JSON/キー/の/パース.json"
```
Once that is done, you should be able to connect to the Google Console, try using the `fastlane supply init` command in the terminal now.
出来たら、Googleコンソルにコネクトができるはず、ターミナルで`fastlane supply init`使ってみてください。
## Testing fastlane 
Now that fastlane has been installed and initiated, we should run a few tests before getting fastlane to Deploy applications for us. Inside of the fastlane/Fastfile file, you can adjust or create different lanes for fastlane to take. Essentially requesting fastlane to complete a different set of commands depending on console command you provide it.
アプリをDeployする前に、ちょっとテストと準備しなければならない。fastlane/Fastfileファイルの中に、色な「lane」と言うが作れます。レインを作ったら、コマンドラインで自分の作った道を有働してくれます。本質的に、fastlaneがコンソールコマンドに応じて異なるコマンドセットを完了するように要求します。

```ruby
lane :tests do
  gradle(task: "test")
end
```
You can find a list of all the other parameters here:
https://docs.fastlane.tools/actions/gradle/#parameters

```ruby
gradle(
  task: "assemble",
  flavor: "ObeyDylan",
  build_type: "Release",
  properties: {
    "versionCode" => 9000,
    "versionName" => "1.0.1",
    # ...
  }
)
```
Example of adding additional properties. 
## Running fastlane - fastlaneの実行
Now that we have tested and gotten some things moving, let's try to execute some of the fastlane functions, such as the auto generation of screenshots and beta application deployment. 
テストが出来ているので、fastlaneのフンクションちょっと実装して展開までやってみましょう。
1. Screenshots - スクリーンショット
2. Beta Deployment - ベータ展開
3. AppStore Deployment - アップストア展開

### 1. Android Screengrab - Screengrabを使って自動でスクリーンショットを撮る
First thing required is the screengrab gem. Install this with the code below.
Screengrabのgemをインストールしてください。

```
sudo gem install screengrab
```
You will also need to add a new dependency to the Gradle file.
Gradleファイル新しいdependencyも入れなければなりません。

```javascript
androidTestCompile 'tools.fastlane:screengrab:1.0.0'
```
The manifest will also require the following permissions.
Manifestはこの許可も必要です。

```javascript
<!-- Access for UI tests to succeed - UI testsのアクセス為に -->
<uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>

<!-- Allows for storing and retrieving screenshots スクリーンショットを保存と撮る -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<!-- Allows changing locales - locales変更できるよう  -->
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION" />
```

Once it is all set up, you can insert `Screengrab.screenshot("name_of_screenshot_here");` into the screens which you want to take screenshots from. To generate all screenshots run `fastlane screengrab` inside the terminal. This will generate screenshots for your application and save them inside `fastlane/metadata/android`. You can check the screenshots inside of the file, and when it is okay to upload to Google Play, `fastlane supply` will upload the screenshots appropriately. 
設定が出来たら、スクリーンショットして欲しい画面に`Screengrab.screenshot("スクリーンショットの名");`を入れてください。全部のスクリーンショットを生成するのはターミナルで`fastlane screengrab`で出来ます。スクリーンショットは`fastlane/metadata/android`で保存しています。ファイルの中を確認したら、GooglePlayにアップロードするのは`fastlane supply`のコマンドで出来ます。
1.`fastlane screengrab`
2.`fastlane supply`

If you would like to do both of these actions in one command, you can also create a path to do so. Add it to the Fastfile.
もしこの二つのアクション、一つのコマンドで出来たかったら、新しいレインを作ったら出来ます。「Fastfile」の中に入れてください。

```ruby
lane :screenshots do
  capture_android_screenshots
  upload_to_play_store
end
```
### 2. Building Beta Application - ベーターアプリをビルドする
To create a beta for your application, inside of the `Fastfile` you will need to declare a new path for the beta verision.
アプリのベーターバーションを作りたかったら、`Fastfile`の中にベーターレインを作らなきゃあかん。新しい「path」を作りましょう。

```ruby
lane :beta do
  # Adjust the `build_type` and `flavor` params as needed to build the right APK for your setup
  gradle(task: 'assemble', build_type: 'Release')
  upload_to_play_store(track: 'beta')
  slack(message: 'Successfully distributed a new beta build')
end
```
This will complete a build, and upload the new application to Google Play. Once the upload is complete, a notification will be sent to Slack.
これだけでベータービルドを作ってくれる、そしてGooglePlayにアップロードしたら、Slackに知らせしてくれます。
### 3. GooglePlayStore (Release) - 展開
To release the application, similarly to deploying a 'beta version' we will have to create a path to release the application on Google `playstore`. Once it is created, you can release your application with the `fastlane playstore` command.
アプリをリリースするのはベーターと同じように作れます。新しい`fastlane`レインを作らなければなりません。設定が終わったら、リリースするのはターミナルに`fastlane playstore`を使いだけです。

```ruby
lane :playstore do
  gradle(
    task: 'assemble',
    build_type: 'Release'
  )
  upload_to_play_store # Uploads the APK built in the gradle step above
  #upload_to_play_store(
  #  track: 'rollout',
  #  rollout: '0.5'
  #)
end
```
___
#Time saved. 
Making use of fastlane allows you to release an application soon after completion. There is no need to do all the manual labour in preparing the application for launch, because it will all be done in code.
fastlaneを使ったら、アプリを出来上がる時、すぐにリリースできるようになります。面倒のリリース準備がすごく少なくなります、コードの中に自動でやってくれます。