FlutterアプリをGitHubActionsでビルドする際にコミット数をビルド番号として設定する
はじめに
先日以下の記事の中でFlutterアプリビルド時のビルド番号の与え方を迷っていると書いていたところ、@idonuntiusさんにコミット数を使ったビルド番号の設定を教えていただいた。
- Flutterで作ったAndroidアプリをGitHubActionsを使ってGooglePlayに自動デプロイする
- Flutterで作ったAndroidアプリをGitHubActionsを使ってAppDistributionに自動デプロイする
実際に自分でも設定してみたところ、とても良かったので紹介する。
事前準備
今回の方法ではcider
というライブラリを使用するのでその紹介を軽くしておく。
ciderとは
パッケージ管理を自動化するためのコマンドラインユーティリティで、pub.dev
で管理されているパッケージだ。
使う際は、グローバルにインストールして使用する。
pub global activate cider
以下が今回使うバージョンに関する簡単な使い方になる。
# 現在のバージョンを取得
cider version
# pubspec.yaml内のバージョンを5.0.0+1に書き換える
cider version 5.0.0+1
cider
はこれ以外にもCHANGELOG.mdの操作やバージョンのバンプアップも良い感じにやってくれる。詳しくは公式のREADMEを読んでいただきたい。
GitHubActionsの設定
cider
の紹介が終わったので今回の本題に入る。
早速だが以下がGitHubActionsの設定になる。不要なステップやビルド時の引数は省略している。
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
cache: true
- name: Set up cider
run: flutter pub global activate cider
- name: Set up build number
run: |
VERSION=$(cider version)
BUILD_NUMBER=$(git rev-list HEAD --count)
cider version $VERSION+$BUILD_NUMBER
- name: Build aab
run: flutter build appbundle
各ステップの紹介
actions/checkout@v3
リポジトリへのチェックアウトのためのアクションだが、今回はfetch-depth: 0
を指定する必要がある。
デフォルトでは直近の1コミット分しか取得されないが、これを指定することでコミット履歴全体を取得できるようになる。以下の記事にも書いておいた。
GitHubActionsでリポジトリ内の全てのコミット履歴を取得できるようにする
Set up Flutter
Flutterをインストールしているだけなので割愛。
Set up cider
ここでcider
のインストールをしている。
Set up build number
ここでpubspec.yaml内のビルド番号書き換えを行っている。
# アプリのバージョンを取得
VERSION=$(cider version)
# コミット数を取得してビルド番号として設定
BUILD_NUMBER=$(git rev-list HEAD --count)
# ciderを使ってpubspec.yamlのバージョンを書き換える
# 例えば、3.0.0+500のようになる
cider version $VERSION+$BUILD_NUMBER
2022-10-06追記
すでにアプリをバージョン番号10000
などでリリースしている場合、この方法は失敗する可能性が大きい。もしそうであれば以下に自分なりの解決法を書いたので参考にしてみていただきたい。
Androidアプリのバージョンコードは最新のものが以前のものよりも常に大きくある必要がある
追記おわり
Build aab
Flutterアプリのビルドを実行している。
この時点でpubspec.yamlにバージョンとビルド番号がcider
によって書き換えられているので、引数からビルド番号を与える必要がなくなった。
おわり
これでビルド時にビルド番号を引数で渡す必要もなくなったし、ビルド番号をGitHubのSecretsで管理する必要もなくなって運用がかなり楽になった。
@idonuntiusさん、教えていただきありがとうございました。