Help us understand the problem. What is going on with this article?

Android GitHub Actions Hands-on

内容

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する(下図)

Setupを進めると初期設定ファイルが「.github/workflows/android.yml」に生成される。変更できるが、ここでは変更しないで進める。

Androidビルドの初期設定

(2020/08/20時点。変更不要)

name: Android CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Build with Gradle
      run: ./gradlew build

(4) 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」は、appフォルダ直下に保存しておく。

(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

2つシークレットを設定する。

名前
FIREBASE_APP_ID アプリID
FIREBASE_TOKEN Firebaseの認証トークン

FIREBASE_TOKENをGitHubのSecretsとして保存するのは、これらがセキュアな情報だから。
FIREBASE_APP_IDはworkflowファイルに直接書いても良さそうだが、FIREBASE_TOKENとまとめて記述した方が管理しやすそうなので、Secretsにしておく。

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

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

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

    - 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/CDの構築経験があります」と言っても良いレベルになれると思う。

zigenin
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした