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

Flutter + GitHub Actions + Firebase App Distributionで自動リリースサイクルを作る(Android編)

Flutterアプリ開発を進めるにあたり、masterにマージしたら、誰でもアプリが実機にインストールできるフローを作りたい。

たまにしかやらなくて忘れそうなので備忘。

やりたいこと

  1. ローカルでもCIでもリリースビルドを作れるようにする
  2. GitHubに署名ファイルはあげない
  3. 自動でバージョンをインクリメントして、Firebase App Distributionにuploadする

ローカルでリリースビルド作れるようにする

オフィシャルドキュメントのこの辺にも書いてある。

1. (無ければ)keystoreファイル作る

サンプルはたくさん転がってるので割愛。
git管理からは外しておく。

2. ローカルでのビルド用にkey.properties作る

storePassword=<password from previous step>
keyPassword=<password from previous step>
keyAlias=key
storeFile=<location of the key store file, such as /Users/<user name>/key.jks>

これもgit管理からは外しておく。

3. アプリのbuild.gradleに下記を追加。

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    // For Local
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
} else {
    // For CI
    keystoreProperties.setProperty('storePassword', System.getenv('KEY_STORE_PASSWORD'))
    keystoreProperties.setProperty('keyPassword', System.getenv('KEY_PASSWORD'))
    keystoreProperties.setProperty('keyAlias', System.getenv('ALIAS'))
    keystoreProperties.setProperty('storeFile', System.getenv('KEY_PATH'))
}

androidブロックに下記を追加(&書換え)

    signingConfigs {
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'])
            storePassword keystoreProperties['storePassword']
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

4. 確認

とりあえずAPK作ってみる
flutter build apk --release

GitHub Actionsでリリースビルド作れるようにする

参照:Signing Flutter Android apps for release in GitHub Actions

1. (無ければ)workflow作る

サンプルはたくさん転がってるので割愛。

2. GitHub Secretsにもろもろ入れとく

key.propertiesの代わり。
この後、これをGitHub Actionsで読み取る。
スクリーンショット 2020-08-10 14.16.06.png

  • ANDROID_KEY_STORE_PASSWORD :point_right: storePassword
  • ANDROID_KEY_PASSWORD :point_right: keyPassword
  • ANDROID_KEY_ALIAS :point_right: keyAlias
  • ANDROID_KEY_JKS :point_right: keystoreファイルをbase64エンコードしたもの。 openssl base64 -A -in key.jks

使わなかったけど、こんなactionもあったりする。
https://github.com/marketplace/actions/sign-android-release

3. workflowにリリースビルドを作るステップを追加

前のステップでGitHub Secretsに保存した値を環境変数に保存。

      - name: set up private files
        run: |
          echo $SIGNING_KEY | base64 -di > android/app/key.jks
        env:
          SIGNING_KEY: ${{ secrets.ANDROID_KEY_JKS }}

      - name: build release apk
        run: |
          flutter build apk --release --build-name=0.0.$GITHUB_RUN_NUMBER --build-number=$GITHUB_RUN_NUMBER
        env:
          KEY_STORE_PASSWORD: ${{ secrets.ANDROID_KEY_STORE_PASSWORD }}
          KEY_PASSWORD: ${{ secrets.ANDROID_KEY_PASSWORD }}
          ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
          KEY_PATH: key.jks

  • keystoreを復元してるところは、iオプションつけないと自分の環境ではこけた。
  • android/appbuild.gradleでビルドするので、android/app/にファイル置いてる。
  • $GITHUB_RUN_NUMBER使って、ビルドごとにパッチバージョンとバージョン番号があがるようにする

Firebase App Distributionへリリース

既存のGitHub Actionの恩恵にあずかって楽する

(App Distributionのセットアップも忘れずに)

      - name: upload artifact to Firebase App Distribution
        uses: wzieba/Firebase-Distribution-Github-Action@v1
        with:
          appId: ${{secrets.FIREBASE_ANDROID_APP_ID}}
          token: ${{secrets.FIREBASE_TOKEN}}
          groups: Developer
          file: build/app/outputs/flutter-apk/app-release.apk

もう一声

  • メジャー・マイナーバージョン名は、workflowの外で定義したい
  • やっぱり署名も既存のactionを使った方が楽かもしれん
tkcm
投稿内容は基本的に自分の備忘録
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
ユーザーは見つかりませんでした