【Flutter】GitHub Actionsでpubspec.yml記載のビルド番号をインクリメントする
概要
最近個人開発や副業でFlutterでCI/CD環境を構築しています。
その中でPRをトリガーにpubspec.yml
記載のビルド番号をインクリメントしてpushまで行うジョブを作ってみたので紹介します。
GitHub Actionsでワークフローが走るたびに採番される番号をビルド番号に使うのも良さそうなのですが、自分の場合はCodemagicも併用して使っており、いつでも切り替えができるような状況にしておきたかったのでワークフローの中でインクリメントできるようにしてみました。
完成形
以下完成形です。
on: pull_request: types: [opened] bump_build_number: name: Bump build number runs-on: ubuntu-latest env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: # 1. PRのHEADブランチをチェックアウト - uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.ref }} # 2. ビルド番号をインクリメント - name: Bump build number run: perl -i -pe 's/^(version:\s+\d+\.\d+\.\d+\+)(\d+)$/$1.($2+1)/e' pubspec.yaml # 3. Git操作をするための設定 - name: Git config run: | git remote set-url origin https://github-actions:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY} git config --global user.name "${GITHUB_ACTOR}" git config --global user.email "${GITHUB_ACTOR}@users.noreply.github.com" # 4. 変更をcommit&push - name: Push updated pubspec.yml run: | git add . git commit -m "Bump build number" git push origin ${{ github.event.pull_request.head.ref }}
順に説明します。
1. PRのHEADブランチをチェックアウト
まずはref
に${{ github.event.pull_request.head.ref }}
を指定してチェックアウトします。
これによって、例えばfeature/xxx
ブランチからdevelop
へ向けたPRを作成するとfeature/xxx
ブランチの最新コミットをチェックアウトしてくれます。
下記理由からref
を指定せずにそのままチェックアウトするとワークフロー内でHEADに対してpushができなくなるため、明示的に指定する必要があります。
pull_requestイベントを起点に動かす場合、actions/checkout はそのPull Requestが生成しようとしているmerge commitをチェックアウトする
2 ビルド番号をインクリメント
perl
を使ってpubspec.yml
のビルド番号をインクリメントしています。
version: 1.0.0+1
に対応する箇所をversion: 1.0.0+2
に置換してくれる形です。
3. Git操作をするための設定
タイトルの通り、Git操作(commitやpush)をするための設定です。
GH_TOKENについては${{ secrets.GITHUB_TOKEN }}
から取得します。
自動でGITHUB_TOKENを設定してくれるので、自前でSercretsに登録する必要はありません。
4. 変更をcommit&push
最後にpubspec.yml
に加えた変更をcommit&pushします。
ここでもチェックアウト時同様に${{ github.event.pull_request.head.ref }}
に対してpushするようにします。
まとめ
このジョブを使うことでPRを作成するたびに自動でビルド番号をインクリメント・コミットしてくれるので、デプロイ時にビルド番号の競合を意識しなくて済むようになります。
個人開発環境では下記のようなワークフローを作っているので、それぞれの事前アクションとしてビルド番号のインクリメント処理を入れています。
feature/xxx
からdevelop
にマージされたらstaging環境アプリをFirebase App Distributionにデプロイrelease/x.x.x
からmaster
にマージされたらproduction環境アプリをApp Store Connect/Google Play Consleにデプロイ
どなたかの参考になれば幸いです!