1. zigenin

    No comment

    zigenin
Changes in body
Source | HTML | Preview

内容

GitHub Actionsを使って、AndroidのCI環境を構築する。最低限のビルド&デプロイができるところまで。

  1. masterの更新時とmasterへのPRを作成したブランチに対して、apkをビルド
  2. ビルドしたapkを保存できるようにする
  3. masterブランチを更新したとき、アプリをFirebase App Distributionで配布する

0. 準備

Android Studioで新規にプロジェクトを作成する。
そのプロジェクトをGitHubのリポジトリにpushする。

完成したサンプルはこちら。
https://github.com/KamikazeZirou/android-github-actions-sample

1. とりあえずビルドする

(1) GitHubのリポジトリのページを開く
(2) GitHub Actionsを押す
(3) AndroidでSetupする(下図)

(4) masterに初期設定をコミットする
masterブランチへのpush or masterブランチへのPRに対して「./gradlew build」を実行する、というのが初期設定。変更不要。そのままコミットする。

(5) GitHubリポジトリ上のGitHub Actionsを開いて、ビルドが実行されていることを確認

2. ビルドしたapkを取得できるようにする

(1) .github/workflows/android.ymlの末尾に以下を追記。

    - name: Store test results
      uses: actions/upload-artifact@v2
      with:
        name: reports
        path: ./**/build/outputs/apk

(2) ブランチ「chore/store_apk_as_artifact」を作って、変更をコミット&pushする

(3) GitHubからmasterへのPRを作成してビルドを実行させる
PRのページが下図のようになっていれば、GitHub Actionsのビルドが実行されている。

(4) apkがartifactとして保存されていることを確認する
PRのページの「Checks」を選択。GitHub Actionsで実行されたworkflowが確認できる(下図)。
image.png

「Artifacts」を押して、ファイルを解凍すると、以下の2つのapkファイルが取得できる。

  • ./app/build/outputs/apk/release/app-release-unsigned.apk
  • ./app/build/outputs/apk/debug/app-debug.apk

これをスマホから開くと、ビルドしたアプリがインストールできる。
レビュー時にコードだけでなく、実際の動作を見るときなどに使える。

(5) ここで作ったPRをmasterにマージしておく

3. masterブランチが更新されたらFirebase App Distributionに配布する

既成のActionsを利用して実現する。
https://github.com/marketplace/actions/firebase-app-distribution

3.1 Firebaseのプロジェクトを作る

(1) Firebase Consoleにアクセスする
https://console.firebase.google.com/u/1/?pli=1

(2) プロジェクトを作る
名前は適当でOK。「hello-github-actions」など。
設定も全部デフォルトでOK。

(3) FirebaseにAndroidアプリを追加する

アプリのパッケージ名には実際のアプリのパッケージ名を入れる。
後はデフォルトでOK。

(4)Firebaseの指示に従って、アプリを設定する(省略可だが、設定した方が実戦的)
設定をする場合は、build.gradleを修正することになるのでmasterにpushしておく。
「google-services.json」はセキュアな情報のため、publicリポジトリの場合はpushするのはN。
「google-services.json」は、適当な場所に保存しておく。

(5)アプリのIDを確認する
Firebaseのプロジェクト概要
→ プロジェクト設定
→ 全般タブ
→ 下スクロールするとアプリIDが見える(下図)

後で使うのでアプリIDをメモしておく。

(6) Firebase App Distributionを開始しておく
Firebaseのプロジェクトのトップ
→ 品質のApp Distribution
→ 開始

下図のような画面の状態になったらOK。

image.png

3.2 Firebaseの認証用トークンを取得しておく

こちらを見ながら、認証用トークンを取得する。後で使うのでメモしておく。

https://firebase.google.com/docs/cli?hl=ja#cli-ci-systems

3.3 認証トークンなどをGitHubのSecretsとして保存する

GitHubのリポジトリのページ
→ Settings
→ Secret

image.png

メモしたアプリIDを「FIREBASE_APP_ID」、認証トークンを「FIREBASE_TOKEN」という名前で設定する。3つシークレットを設定する。
「google-services.json」のファイルの中身を「GOOGLE_SERVICES_JSON」という名前で設定する(3.1でFirebaseのアプリの詳細な設定をスキップしている場合は、設定不要)。

名前
FIREBASE_APP_ID アプリID
FIREBASE_TOKEN Firebaseの認証トークン
GOOGLE_SERVICES_JSON 「google-services.json」のファイルの中身(3-1-(4)の手順を省略した場合は不要)

FIREBASE_TOKENとGOOGLE_SERVICES_JSONをGitHubのSecretsとして保存するのは、これらがセキュアな情報だから。
FIREBASE_APP_IDはworkflowファイルに直接書いても良さそうだが、Secretsにしておいた方が利便性が高い。無難でもある。

3.4 GitHub Actionsのワークフローを設定する

(1)適当なブランチを作成する

(2)android.ymlの「Build with Gradle」の付近を変更する

    - name: Set google-services.json
      run: echo "${GOOGLE_SERVICES_JSON}" > app/google-services.json
      env:
        GOOGLE_SERVICES_JSON: ${{secrets.GOOGLE_SERVICES_JSON}}
    - name: Build with Gradle
      run: ./gradlew build
    - name: upload artifact to Firebase App Distribution
      if: github.event_name == 'push'
      uses: wzieba/Firebase-Distribution-Github-Action@v1
      with:
        appId: ${{secrets.FIREBASE_APP_ID}}
        token: ${{secrets.FIREBASE_TOKEN}}
        file: app/build/outputs/apk/debug/app-debug.apk

示していない範囲は変更なし。

Firebase App Distributionの配布は、既成のGitHub Actionsを利用している。
詳細はこちら。
https://github.com/marketplace/actions/firebase-app-distribution

(3)変更をプッシュしてPRを作る
PRのChecksからGitHub Actionsを見ると、Firebase App Distributionの配布はスキップされていることが確認できる。

(4)PRをmasterにマージする
PRのChecksからGitHub Actionsを見ると、、Firebase App Distributionの配布はスキップされていないことが確認できる。

Firebase App Distributionを見ると、アプリが配布されていることが確認できる。
(Firebase上のアプリのプロジェクトを開く -> 品質のApp Distribution)

未配信になっているのは、Firebase App Distributionにテスターのグループを設定していないから。
これを設定して、GitHub ActionsのFirebase App Distributionの配布でテスターのグループを指定すれば、配信できる。宿題として丁度良いと思う(この記事を見る人がいるのかは謎だが)。

終わりに

以上で、最低限のCI/CD環境は構築できた。
後は、依存ライブラリのキャッシュなどのビルド速度のチューニング、自動テスト実行、Store配布までやれば、「モバイルアプリのCI/CDnの構築経験があります」と言っても良いレベルになれると思う。