FastlaneでReactNativeのデプロイを自動化する(android)

# 手動作業を自動化する

ReactNativeで作成したアプリを内部テストする際に、手動でGoogle play consoleに上げるところを`Fastlane`を使用し、自動化します。
ios版はこちら↓
[FastlaneでReactNativeのデプロイを自動化する(ios)](https://qiita.com/kenkono/items/a3eb4d1a83d8b1d70864)

# 注意点
ios版と違い、androidについては初めのデプロイを手動で実行する必要があります。
`keystore`を作成し、internalにアプリをデプロイしたことを前提に話を進めます。
![Screen Shot 2019-08-24 at 14.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291139/45adf629-53e5-ce48-6185-be026fa73776.png)


# keystoreの作成について
基本的に下記公式ドキュメントに従えば良いですが、最後の作成の際のコマンドは下記を使用します。
[Publishing to Google Play Store](https://facebook.github.io/react-native/docs/signed-apk-android)

```
cd android
./gradlew assembleRelease
```

# google play consoleのapiの入手
下記公式ドキュメントに沿って(サービス アカウントを使用する)、json形式のapiを入手します。
https://developers.google.com/android-publisher/getting_started?hl=ja
jsonファイルを`android/secure(新規作成)`直下に保存します。

# fastlaneの設定

```
sudo gem install bundler
cd android
bundle init
```

`Gemfile`が作成されるので、下記を記述します。

```ruby:Gemfile
gem "fastlane"
```

fastlaneをインストールします。

```
bundle update
```

次にfastlaneを初期化します。

```
bundle exec fastlane init
```
質問に対する回答
Package name -> android/app/build.gradle内にある`applicationId`を入力
Path to the json -> `secure/***.json`を入力
meta -> y

# プラグインの導入
fastlane実行の際に、自動的にversion numberを上げるためにプラグインを導入します。

```
bundle exec fastlane add_plugin increment_version_code
```

`Gemfile`に下記が自動的に記述されます。

```ruby:Gemfile
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
eval_gemfile(plugins_path) if File.exist?(plugins_path)
```

# fastfileの編集

下記を記述します。

```
default_platform(:android)

platform :android do

  // descは説明文ですので、任意の文を挿入
  desc "submit internal release to Google Play Store"
  // internalテストに関する記述
  lane :internal do
    # build.gradleファイルのversion numberを実行する度に上げる
    increment_version_code(
      gradle_file_path: "./app/build.gradle"
    )
    # apkファイルの設定
    gradle(task: "assembleRelease")
    # apkファイルの検索
    supply(
      track: "internal",
      apk: "#{lane_context[SharedValues:: GRADLE_APK_OUTPUT_PATH]}"
    )
  end

// 以下は他のデプロイ先に関する記述です。
  desc "submit alpha release to Google Play Store"
  lane :alpha do
    increment_version_code(
      gradle_file_path: "./app/build.gradle"
    )
    gradle(task: "assembleRelease")
    supply(
      track: "alpha",
      apk: "#{lane_context[SharedValues:: GRADLE_APK_OUTPUT_PATH]}"
    )
  end

  desc "submit beta release to Google Play Store"
  lane :beta do
    increment_version_code(
      gradle_file_path: "./app/build.gradle"
    )
    gradle(task: "assembleRelease")
    supply(
      track: "beta",
      apk: "#{lane_context[SharedValues:: GRADLE_APK_OUTPUT_PATH]}"
    )
  end

  desc "submit production release to Google Play Store"
  lane :production do
    increment_version_code(
      gradle_file_path: "./app/build.gradle"
    )
    gradle(task: "assembleRelease")
    supply(
      track: "production",
      apk: "#{lane_context[SharedValues:: GRADLE_APK_OUTPUT_PATH]}"
    )
  end

end
```

# fastlaneの実行

```
bundle exec fastlane internal
```

実行後、google play console内にてアプリがデプロイされたことが確認できます。
`alpha` `beta` `production`へのデプロイについても上記コマンドの`internal`を書き換えれば実行可能です。

# Bitriseへ組み込む
CIツールの`Bitrise`を使用すると、githubにpushした際に自動的にfastlaneを実行することができます。
詳細は下記へ↓
[FastlaneのコマンドをBitriseに組み込む(android,ReactNative)](https://qiita.com/kenkono/items/9e00eb3de49208e8892e)