FastlaneのコマンドをBitriseに組み込む(android,ReactNative)

下記記事でReactNativeアプリのデプロイをFastlaneで自動化する手順を紹介しました。
[FastlaneでReactNativeのデプロイを自動化する(android)](https://qiita.com/kenkono/items/4b58f09eb5ffa177eeeb)

今回はCICDツールとして有名な`Bitrise`を使用して、Githubにpushした際に、自動的にfastlaneが実行する仕組みを構築します。
ios版はこちら↓
[FastlaneのコマンドをBitriseに組み込む(ios,ReactNative)](https://qiita.com/kenkono/items/b31bc3c3a5aed236643c)

# 事前準備
Bitriseに対象となるGithubのrepositoryを登録しておきます。
注意点として、SSHの公開鍵の登録ですが、repositry単体ではなく、Githubユーザーに対して登録するようにします。
repository単位で登録すると、fastlane実行の際に証明書を引っ張ってくる場所でエラーが発生します。

Bitrise
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/013be289-b728-e529-ad2a-cc3c90fc0e86.png)
GitHub
![Screen Shot 2019-08-24 at 15.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/1c1fb906-5e31-dc55-8c1b-bc40cbba4025.png)

また、後の設定で環境変数を参照する関係で`android/app/build.gradle`のファイル記述を一部変更します。

```ruby:build.gradle
    signingConfigs {
        release {
                storeFile file(System.getenv("MYAPP_UPLOAD_STORE_FILE"))
                storePassword System.getenv("MYAPP_UPLOAD_STORE_PASSWORD")
                keyAlias System.getenv("MYAPP_UPLOAD_KEY_ALIAS")
                keyPassword System.getenv("MYAPP_UPLOAD_KEY_PASSWORD")
        }
    }
```

# 環境変数の設定
下記の変数を追加します。
`GITHUB_USER_EMAIL`と`GITHUB_USER_NAME`は使用しているGithubの情報を入力します。
![Screen Shot 2019-08-24 at 15.59.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/c73eb871-16b3-f790-e8ba-8599bc93e59b.png)


# secretの設定
下記の変数を追加します。
`GOOGLE_JSON_SECRET_FILE`のjsonファイルはgoogle play consoleのapiファイルですので、下記記事で取得した際の名前に書き換えてください。
[google play consoleのapiの入手](https://qiita.com/kenkono/items/4b58f09eb5ffa177eeeb#google-play-console%E3%81%AEapi%E3%81%AE%E5%85%A5%E6%89%8B)

- MYAPP_UPLOAD_STORE_FILE = $BITRISE_SOURCE_DIR/android/secure/my-upload-key.keystore
- MYAPP_UPLOAD_STORE_PASSWORD = $BITRISEIO_ANDROID_KEYSTORE_PASSWORD
- MYAPP_UPLOAD_KEY_ALIAS = $BITRISEIO_ANDROID_KEYSTORE_ALIAS
- MYAPP_UPLOAD_KEY_PASSWORD = $BITRISEIO_ANDROID_KEYSTORE_PRIVATE_KEY_PASSWORD
- GOOGLE_JSON_SECRET_FILE = $BITRISE_SOURCE_DIR/android/secure/test.json
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/a6569986-8e68-e472-4038-fa94e79b705b.png)

# code signingの設定
### keystoreファイルのアップロード
下記記事で取得したkeystoreファイルをアップロードします。
[keystoreの作成について](https://qiita.com/kenkono/items/4b58f09eb5ffa177eeeb#keystore%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
その後、keystore作成の際に入力したaliasとpasswordを変数に入力します。
参考:

```
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/60778686-fe10-29bc-aa17-799694c1008d.png)

### google play consoleのapiファイルのアップロード
下記記事で取得したkeystoreファイルをアップロードします。
[google play consoleのapiの入手](https://qiita.com/kenkono/items/4b58f09eb5ffa177eeeb#google-play-console%E3%81%AEapi%E3%81%AE%E5%85%A5%E6%89%8B)

![Screen Shot 2019-08-24 at 16.23.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/f7e2d8e4-6d35-7f58-d75f-a65db22b273f.png)
`File Storage ID`には`JSON_SECRET`と入力しておきます。

# Workflowの設定
下記イベントを追加します。
基本的に追加した後に設定を変更する必要はありませんが、一部イベントは記述を書き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/520e0b06-7c23-54d3-43ab-5a6a6b1d785c.png)


### Script
script contentsを下記のようにします。

```
#!/usr/bin/env bash
# fail if any commands fails
set -e
# debug log
set -x

# Add github.com to known host 
ssh-keyscan -t rsa github.com >> ~/.ssh/known_hosts

# Configure Git user
git config --global user.name $GITHUB_USER_NAME
git config --global user.email $GITHUB_USER_EMAIL
```

### File Downloader（1つ目）
Download source url
`$BITRISEIO_ANDROID_KEYSTORE_URL`を入力
Download destination path
`$MYAPP_UPLOAD_STORE_FILE`を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/96e11eae-5428-4cb7-3700-6f487dbf202d.png)

### File Downloader（2つ目）
Download source url 
`$BITRISEIO_JSON_SECRET_URL`を入力
Download destination path
`$GOOGLE_JSON_SECRET_FILE`を入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/910d3d4b-b438-2ed8-a3ad-586f7bc9b9d7.png)

### Run npm command

Working directory
$BITRISE_SOURCE_DIRを入力
The `npm` command with arguments to run
installを入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/ce56dc11-7a5a-357b-ce6c-34d2a10c7602.png)

### fastlane
fastlane lane
`$FASTLANE_LANE`を入力
Working directory
`$FASTLANE_WORK_DIR`を入力
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/9325a068-503a-97ae-ac6f-ca74ddbd788c.png)

# トリガーの設定

任意のブランチにpushした際に、どのwrokflowを実行するかを設定します。
workflowは先程設定したflowを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/d22f6df1-89d8-8f23-b614-e31bee46786b.png)

# 実行
指定したbranchにpushしますと、Bitriseが発動します。

# バージョン番号の自動インクリメントについて
fastlaneの設定でバージョン番号は自動的に上がるのですが、Bitriseのサーバ上で実行されるため手元のファイルでは更新されない問題が発生します。
下記記事でそれに対する対応法を記述しました。
[Bitriseのナンバリングを利用して、バージョンの自動インクリメントを実現(ReactNative, android)](https://qiita.com/kenkono/items/6b0f6d8634b0a6cbaf4e)