ないぱかの記録

ないぱかからあるぱかになれるか

【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にデプロイ

どなたかの参考になれば幸いです!

参考

r7kamura.com

github.com