CircleCIとGitHubでAndroidの自動テスト環境を構築するためのメモ

# CircleCIでAndroidの自動テスト

個人的な勉強でCircleCIとGitHubの連携を試した時のメモです。

おそらく、次回同じことをやろうとした時には忘れているのでメモを残します。

## 目次

- [CircleCIでAndroidの自動テスト](#circleciでandroidの自動テスト)
  - [目次](#目次)
  - [手順](#手順)
  - [GitHubのリポジトリを用意する](#githubのリポジトリを用意する)
  - [CircleCIのアカウントを作成する](#circleciのアカウントを作成する)
  - [CircleCIとGitHubを連携させる](#circleciとgithubを連携させる)
    - [鍵の作成](#鍵の作成)
    - [公開鍵をGitHubへ保管する](#公開鍵をgithubへ保管する)
    - [秘密鍵をCircleCIへ保管する](#秘密鍵をcircleciへ保管する)
  - [スクリプトを修正する](#スクリプトを修正する)
    - [circleci-project-setupをpullする](#circleci-project-setupをpullする)
    - [.circleci/config.ymlを修正する](#circleciconfigymlを修正する)
      - [必ずfailするのを修正する](#必ずfailするのを修正する)
      - [テスト項目を追加する](#テスト項目を追加する)
  - [できあがり](#できあがり)

## 手順

1. GitHubのリポジトリを用意する
2. CircleCIのアカウントを作成する
3. CircleCIとGitHubを連携させる
4. スクリプトを修正する

## GitHubのリポジトリを用意する

これは説明するまでもないですね。

## CircleCIのアカウントを作成する

GitHubアカウントで登録してしまえば、CircleCIで新たにアカウントを作成しなくて済みます。

- その場合も、事後的にメールアドレスを登録して認証しないと一部の機能が使えないようです。

## CircleCIとGitHubを連携させる

鍵を作成して、CircleCI側とGitHub側それぞれに預けます。

### 鍵の作成

<https://circleci.com/docs/ja/add-ssh-key/>

```text
ssh-keygen -t ed25519 -C "email_address@example.ne.jp"
```

実行すると、実行したディレクトリに`key`と`key.pub`というファイルができます。

- 前者が秘密鍵です。CircleCIに保管します。
- 後者が公開鍵です。GitHubに保管します。

### 公開鍵をGitHubへ保管する

手順

1. GitHubのRepositoryを選ぶ
2. Settingsg -> Deploy keys -> Add deploy keyと進む
3. 適当なタイトルをつけて、先ほど作成した公開鍵を貼り付け、`Add key`を押す

今回の例だと、公開鍵は
```text
ssh-ed25519 ...(鍵本体)... email_address@example.ne.jp
```

のような型式になっていると思います。

### 秘密鍵をCircleCIへ保管する

CircleCIにログインして`Projects` -> `Create Project` -> `GitHtb`と進みます。

- 進んだ先の画面では、実は上記の「鍵の作成」「公開鍵をGitHubへ保管する」部分も含めた説明があります。

わかりやすい名前をプロジェクトにつけ、秘密鍵を`Private Key`蘭に貼り付けます。
    
```text
-----BEGIN OPENSSH PRIVATE KEY-----
...(鍵本体)...
-----END OPENSSH PRIVATE KEY-----
```

秘密鍵はこんな型式だと思います。`BEGIN`の行から`END`の行まで、ハイフンを含めて全部貼り付けます。

最後にリポジトリを選んで`Create Project`を押せば完成です。

## スクリプトを修正する

CircleCIのプロジェクト作成時、GitHubリポジトリに`.circleci/config.yml`が存在しない場合はCircleCIがファイルのプルリクエストを作成します。

これ自体は確実に`fail`する上に、何のテストも実施してくれません。なので、`fail`しないようにまたtestを実施するように修正します。

### circleci-project-setupをpullする

GitHubのremoteに`circleci-project-setup`というブランチができているはずなので、これをpullします。

### .circleci/config.ymlを修正する

ドットファイルなので、所在に注意してください。

#### 必ずfailするのを修正する

```yml
- run:
    name: Run tests
    command: echo 'replace me with real tests!' && false
```

この最後の`&& false`を削除すると、とりあえずは`fail`しなくなります。ただし、testと言いながら何も実施していないです。

#### テスト項目を追加する

追加する項目は以下です。

1. androidのorbを追加する
2. `jobs:`の下に`unit-test`と`android-test`を定義する
3. `workflows`に`unit-test`と`android-test`を追加する

```yml : config.yml
version: 2.1
...
orbs:
  android: circleci/android@2.5.0
...
jobs:
  unit-test:
    executor:
      name: android/android-machine
      #resource-class: xlarge <- これは課金アイテム
      tag: 2024.01.1
    steps:
      - checkout
      - android/restore-gradle-cache
      - android/restore-build-cache
      - android/run-tests:
          test-command: ./gradlew testDebug
      - android/save-gradle-cache
      - android/save-build-cache
  android-test:
    executor:
      name: android/android-machine
      #resource-class: xlarge
      tag: 2024.01.1
    steps:
      - checkout
      - android/start-emulator-and-run-tests
...
workflows:
  example:
    jobs:
      - unit-test
      - android-test
      - build:
          requires:
            - unit-test
            - android-test
      - deploy:
          requires:
            - unit-test
            - android-test
```

## できあがり

何かすると自動でテストが走るようになりました。何でもかんでも走るので、不要なテストは避けるような設定を入れるべきかもしれません。