AndroidアプリをCircleCiで自動ビルドしてPlayストア自動アップロードまで試してみる

## 概要
AndroidアプリのCircleCiによる自動ビルドからPlayストア自動アップロードまで試してみる
これでアプリを自前でビルドして作成し、手動でPlayストアにアップロードする手間が省かれる

## 前提条件
前提条件として既にPlayストアに公開済みのアプリがあること。app bundleに対応していること（apkではなくaabを対象とする）

## ビルド設定
`./gradlew bundleRelease` で署名付きaabが出力されるよう設定しておく

```build.gradle
...
android {
    ...
    signingConfigs {
        release {
            storeFile file('../keystore/xxxx.jks')
            storePassword 'xxxx'
            keyAlias = 'xxxx'
            keyPassword 'xxxx'
        }
    }
    ...
    buildTypes {
        ...
        release {
            ...
            signingConfig signingConfigs.release
        }
        ...
    }
    ...
}
...
```

## CircleCiの導入
CircleCiのページを開き、GitHub もしくは BitBucket のアカウントでログインする。ログインするとリポジトリが並んでいるので自動ビルドしたいリポジトリを選択する
プロジェクトのルートフォルダに `.circleci/config.yml` を作成し、以下の内容を記述する

```config.yml
version: 2.1

orbs:
  android: circleci/android@1.0.3

jobs:
  build:
    executor:
      name: android/android-machine

    steps:
      - checkout

      - run:
          name: Release build
          command: |
            ./gradlew bundleRelease;

      - store_artifacts:
          path: app/build/outputs/bundle/release/app-release.aab
          destination: app-release.aab

workflows:
  sample:
    jobs:
      - build:
          filters:
            branches:
              only:
                - /release\/.*/

```

これで`release` ブランチがプッシュされると `aab` が自動ビルドされ、成果物を CircleCi 上からダウンロードできるようになる
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/80c29d73-8f6a-325e-8f44-450764d5b582.png" width="800">

## Playストア自動アップロード
続いてビルドした `aab` を `fastlane` を使って自動アップロードする

### Xcode コマンドラインツールのインストール
`xcode-select --install` を実行

### fastlane のインストール
`brew install fastlane --cask` を実行

インストールが完了したら `fastlane` へパスを通す

```
PATH=$PATH:$HOME/.fastlane/bin
```

### fastlane の初期化
ターミナルで Androidプロジェクト のルートディレクトリ（gradlewがあるフォルダがよさげ）に移動し`fastlane init` を実行

- Androidアプリの `applicationId` を聞かれるので入力
- `サービスアカウントJSONファイル` の名前を聞かれるので `fastlane/api.json` と入力
- fastlane を通して Google Play に情報をアップロードするか聞かれるので `n` と入力

この作業で `fastlane` フォルダと、その配下に `Appfile` , `Fastfile` が生成される

### サービスアカウントJSONファイルの取得
先程指定した `api.json` を入手する必要がある。 [Google Play Console](https://play.google.com/console/u/0/developers) を開き、 `API アクセス` を選択。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/fdae645c-b52e-75da-1427-e483dc78d99a.png" width="250">
ここで権限がないと以下のように表示され `サービスアカウントJSONファイル` を入手できないので、権限のある人に作業を依頼する必要がある
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/2692362a-6162-1fe1-69f5-344e36cda9fe.png" width="800">
権限がある場合は右下の `新しいサービスアカウントを作成` を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/8a893070-5cd4-defb-689d-219873b78f32.png" width="800">
以下のようなダイアログが表示されるので、表示したまま `Google Cloud Platform` のリンクを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/324eab47-dbfd-9c54-850b-1c7b93e69eb0.png" width="350">
`Google Cloud Console` で `サービスアカウントを作成` を選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/5a9f13c6-5d1a-04c8-0e06-22b5d5d89746.png" width="550">
`サービスアカウント名` に任意のアカウント名を入力（`Google Play Deploy` など？）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/d3503c94-e541-b9ac-7912-c5ab538b47ca.png" width="550">
`ロール` に `サービスアカウントユーザー` を選択
`作成して続行` をクリック
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/8c7a7428-fe28-936c-a1ab-9f8cb05ffd02.png" width="550">
完了を選択
作成されたサービスアカウントを選択し、 `キー` のタブを選択。　`鍵を追加` から `新しい鍵を作成` を選択し、JSON形式で作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/0e3d6af4-2729-ad2f-30b4-c066fad9792d.png" width="350">
`サービスアカウントJSONファイル` のダウンロードが始まるので保存
ここまでで `Google Cloud Platform` 側の作業は完了である。ダイアログが開いたままになっている `Google Play Console`のタブを開く。完了をクリックすると先程追加したサービスアカウントが表示される
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/a52e72da-1966-db84-d4c7-0a9345eae777.png" width="850">
`アクセスを許可` をクリック。リリースの箇所にチェックが入っていることを確認し、 `ユーザーを招待` をクリック



これで有効な `サービスアカウントJSONファイル` が取得できたので、Androidプロジェクトの `fastlane` フォルダの下に `api.json` とリネームし配置する

### fastlane/Fastfile の編集
以下のように記述する。リリース版 `aab` をビルドし、 Google Play Console の `内部テスト` トラックに自動アップロードされる。(`track` は `production`, `beta`, `alpha`, `internal`) が指定できる

```Fastfile
default_platform(:android)

platform :android do
  lane :playstore do
    gradle(task: "app:bundleRelease")

    upload_to_play_store(
      skip_upload_apk:true,
      track:'internal'
    )
  end
end
```

### CircleCi設定ファイルの編集
以下の記述を追記。これで CircleCi 側で `fastlane` がインストールされ、上記 `Fastfile` スクリプトが実行される

```config.yml
      ...
      - run:
          name: Install fastlane
          command: bundle install
      - run:
          name: Execute fastlane
          command: bundle exec fastlane playstore
      ...
```

## まとめ 
AndroidアプリのCircleCiによる自動ビルドからPlayストア自動アップロードまでできた。
これでアプリを自前でビルドして作成し、手動でPlayストアにアップロードする手間が省かれた :ok_woman:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/18d1e5a5-1d6f-7f92-66ee-328b6d2d23e3.png" width="750">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/b06bfb81-3380-e76a-fd11-574dc201bf9f.png" width="750">

## おまけ
ちなみに内部テストでも審査は入るもよう
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141937/87ea0101-b711-a7b3-c4a2-818f4ea84798.png" width="450">

## 参考
[fastlane による Android アプリの継続的インテグレーション & デプロイメント](https://circleci.com/ja/blog/continuous-integration-and-deployment-for-android-apps-with-fastlane/)