BitriseでAndroidアプリをビルドする

## この記事なに
+ BitriseでAndroidアプリをビルドする際の超基本的な手順をざっくりと記述しています
+ ほぼ[公式ドキュメント](https://devcenter.bitrise.io/)に記載されている内容です


##Bitriseとは
[Bitrise](https://www.bitrise.io/)
[BitriseのGitHub](https://github.com/Bitrise-io)
GUIで直感的にビルドフローを作成できるOSSなCIサービスです。

[プランは4つ](https://www.bitrise.io/pricing/teams)あり、月あたりのビルド回数や利用メンバー数、並列処理数などに違いがあるようです。`Hobby`という無料プランも用意されているので、趣味の開発でもBitriseでCI廻せます:dizzy:

Bitriseでは基本的にGUIでビルドフローを作っていきます。また、フローを作っていくと最終的にはymlファイルが生成されるため、慣れている方はこのymlを直接編集することも可能です。

## Bitriseのアカウント作成
Sign-up画面でユーザー名、パスワードを設定します。
途中で所属企業の情報を聞かれますが、空欄のままでも問題ありませんでした。
<img width="585" alt="sign-up.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/b7c8bddf-6aba-5f98-b8a8-a8332f8b3f44.png">
アカウントができました:tada:

## BitriseとGitHubを連携
上記の画面下部の`Add First App`ボタンをクリックするとアプリの登録・設定画面に進みます。Bitriseでは1つのレポジトリをアプリ(App)として登録・管理していくイメージになります。

連携先としてGitHubを選択しレポジトリを選択、ビルド対象ブランチ名など必要な情報を入力していきます:muscle:
ここでprivateレポジトリを選択した場合にはSSH Keyの設定画面が出てきますが、焦らず[このページ](https://devcenter.bitrise.io/getting-started/adding-a-new-app/setting-up-ssh-keys/)を参照して自動or手動でKeyを設定します:thumbsup:

レポジトリがCloneされてチェックが行われ、
<img width="1168" alt="validation.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/9fbc5e41-23f5-9a3d-9da0-bd2e4dc071b0.png">

Androidプロジェクトと認識されます:sparkles:
<img width="1147" alt="done_validation.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/2272d1de-06e2-6f6c-0eca-102165bdebd6.png">

ビルドしたいModule、Variantを入力していきます:muscle:
また、デフォルトでそうなっていると思いますが、`The root directory of an Android project`はカレントパス(`.`)を入力すると吉です。
<img width="1112" alt="setting_configuration.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/feceb170-7b25-10dc-63c0-374c667d916f.png">


最後にWebHookを設定するか聞かれますが、ここでは一旦スキップします。
最初のビルドをスタートします:star:
<img width="1262" alt="first_build.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/70642ade-ce8b-af3e-8ca8-78f4677db6e3.png">

ビルド中の画面
<img width="1265" alt="building.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/4440d97d-b976-5e77-8931-73c22d1257b7.png">

ビルドが終わるまで待ちます。
ここでビルドが失敗しても気にせずに先に進みます:punch:

## Workflowの作成
Bitriseの`Workflow`を作っていきます。先程のビルド画面の↓のボタンを押すとWorkflow編集画面に飛べます。
<img width="208" alt="open_workflow_editor.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/68b55b1f-892b-a114-27f6-d5573a829763.png">

画面左側に`Activate SSH key (RSA private key)`から始まるボックスが縦に並んでいるかと思います。この1つ1つのボックスがBitriseでは`Step`と呼ばれ、`Step`の一連の流れが`Workflow`となります。

`Step`はDrag&Dropで順番を入れ替えることが可能で、`Step`間の`+`ボタンから新たな`Step`を追加することができます。

デフォルトで用意されている`Android Unit Test`の下に`Android Build`,`Sign APK`を追加してみました↓
<img width="363" alt="steps.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/c7f07552-a0b2-1203-0aa1-3dcc829d2bf2.png">

そしてWorkflowは1つのレポジトリに複数作成することができます。
例えば、PullRequest時、デイリービルド時、リリース時...などにそれぞれ対応する`Workflow`をつくることが可能です。

↓このボタンから新しい`Workflow`を追加できて......
<img width="159" alt="add_workflow.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/cd7a9c1f-16f0-7def-6f1a-2e2f3fbeadb7.png">

こんな感じで入力してDoneすると、primary-Workflowがコピーされてstaging-Workflowが作られます:sparkles:
<img width="506" alt="plus_workflow.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/ea8fb20e-5201-fc88-f59d-a17bf1f6596b.png">

### 環境変数について
ステップの前に環境変数について簡単に説明します。
#### Env vars
通常の環境変数です。デフォルトで$MODULEなどが定義されている他、追加・削除・編集が可能です。
特定の`Workflow`内でのみ参照可能な変数も作ることができます。

#### Secrets
編集方法、使用方法は`Env vars`と変わりませんが、`Secrets`のvalueは暗号化されて保存され、bitrise.ymlにも記述されません。従って、センシティブな情報を定義するのにピッタリです。
Slack連携URLやkeystoreのパスワードなどは`Env vars`ではなく`Secrets`で管理するのが良いでしょう

## ステップ
Androidのビルドに関する`Step`を簡単に見ていきます。

### Install missing Android SDK components
名前の通りですが、SDKをインストールするステップになります。
#### NDKのインストール
NDKが必要なアプリの場合にはNDKバージョンにビルドに必要なNDKバージョンを書けばOKです。
<img width="871" alt="ndk_version.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/11928632-c3e8-5e81-a3f5-22362a3e33f8.png">
[参考](https://devcenter.bitrise.io/tips-and-tricks/android-tips-and-tricks/#automatic-installation-of-android-sdks-and-dependencies)

### Android Build
ビルドステップになります。
ステップ設定パネル下部のOptionsから、apkファイルの格納先を指定できます。
<img width="863" alt="apk_dir.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/f6b91a27-2ecd-c9a0-d0ca-6cb3509b9183.png">
Androidライブラリをビルドする場合にはapkではなくaarへのパスを指定しましょう。

### Sign APK
ビルドアップステップで作成したapkに署名をするステップです。
[署名の方法には複数の種類がある](https://devcenter.bitrise.io/code-signing/android-code-signing/android-code-signing-procedures/)ので、お好みの方法で実装してください。

#### Variantごとに異なる署名をしたい
実は、上記の方法ではアップロードできるkeystoreファイルは1つだけです。
debug、staging、releaseで異なる署名をすることができません困った:mask:

そんな時には[GENERIC FILE STORAGE](https://devcenter.bitrise.io/tutorials/how-to-use-the-generic-file-storage/)を使います。
なおこの方法では`Sign APK`ステップは不要です。

keystoreを複数アップロードし、前述した`Secrets`にそれぞれのkeystoreでの署名に必要な`keystore password`や`key alias`、`key password`を登録します。
<img width="1244" alt="keystore_info.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/6be35398-ffdb-aea0-5c18-e2f2385999e0.png">
さらに公式ドキュメントを参考にして、`File Downloader`を`BUILD APK`ステップの前に追加し、keystoreファイルを任意の場所にダウンロードしておきます。

Android Studioでbuild.gradleを開き、signing情報として`Secrets`を参照するようにします。

```build.gradle
    signingConfigs {
        staging {
            storeFile file(System.getenv('HOME') + '/keystore/staging.keystore')
            keyPassword System.getenv('STAGING_KEYSTORE_PASS')
            keyAlias System.getenv('STAGING_KEY_ALIAS')
            keyPassword System.getenv('STAGING_KEY_PASS')
        }
    }
```
これで`Android Build`ステップにて署名されたapkが生成されます:sparkles:

## Triggerの設定
作ったWorkflowを実施するタイミングを設定します。
`Trigger`はWorkflow編集画面の「Trigger」タブから設定できます:point_up:

<img width="1267" alt="setting_trigger.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/3443bac9-3bf5-0791-e1df-7b12f6c48d3d.png">
↑のような設定で、任意のブランチにPullRequestが作成されたタイミングでpullrequest-workflowが実行されるようになります:star2:

## まとめ
+ Bitriseではビルドステップを視覚的に作れるので、CIに不慣れでもあまりハマることなくビルドまで持っていける
+ [公式ドキュメント](https://devcenter.bitrise.io/)が充実しています
+ どんどんCI廻していきましょう！