Flutterアプリのリリース直前にpubspec.yamlのバージョンを上げる作業をGitHubActionsを使って自動化する
背景
Flutterアプリをリリースする直前に毎回pubspec.yaml
内のバージョンを新しいものに差し替え、コミットしてプッシュし、PullRequestを出していた。
毎回やっていては流石に面倒で自動化したいと考えていたので今回対応してみた。
(そもそもアプリのバージョン管理をpubspec.yaml
以外でやっているところあれば教えてください)
自動化処理の流れ
以下が全体の流れとなる。
- リリースする際はdevelopブランチからmainブランチに対してPullRequestを作成しているので、これをトリガーとして自動化処理を走らせる。
- トリガーについては個別の運用に合わせて変えていただきたい。
- PullRequestのタイトルから今回のリリースで適用されるバージョンを取得する。
pubspec.yaml
内のバージョン記載箇所を上記で取得した新しいバージョンで書き換える。- コミットして新しいPullRequestを作成する。
組んだワークフロー
それを踏まえて組んだワークフローが以下になる。詳細をこのあと説明する。
name: Create pull request for version up
on:
pull_request:
types:
- opened
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
if: ${{ github.base_ref == 'main' && github.head_ref == 'develop' }}
steps:
- uses: actions/checkout@v3
- name: Get new version from PR title
run: |
NEW_VERSION=$(echo ${{ github.event.pull_request.title }} | grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?")
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV
- name: Version up
run: |
sed -i -e "6 s/.*/version: $NEW_VERSION/" pubspec.yaml
- name: Create pull request
uses: peter-evans/create-pull-request@v4
with:
title: ':arrow_up: v${{ env.NEW_VERSION }}'
body: 'v${{ env.NEW_VERSION }}'
commit-message: ':arrow_up: v${{ env.NEW_VERSION }}'
base: develop
branch: feature/v${{ env.NEW_VERSION }}
各ステップの詳細
on.pull_request
これがトリガーになる。types.opened
でPullRequestが作成されたときというイベントで限定し、branches.main
でmain
ブランチに対するPullRequestという限定をおこなっている。
イベントについてはトリガーごとに色々あるので公式ドキュメントを見ておくと場面にあったものを見つけられると思われる。
if: ${{ github.base_ref == 'main' && github.head_ref == 'develop' }}
Bitriseのようにトリガーを設定する際にsource/targetブランチの設定ができないので、ここで設定している。
mainブランチに対するPullRequestはリリースの時のみしか作成しないが念の為。
actions/checkout@v3
リポジトリへのチェックアウト。
Get new version from PR title
ここでPullRequestのタイトルから新しいバージョンを取得している。
run: |
NEW_VERSION=$(echo ${{ github.event.pull_request.title }} | grep -o -E "([0-9]+\.){1}[0-9]+(\.[0-9]+)?")
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV
${{ github.event.pull_request.title }}
でPRのタイトルを取得でき、そこからgrep
でバージョン部分を抽出している。
PullRequestのタイトルは固定しているわけではないので、v1.2.0
や1.2.0
、Release v1.2.0
のようなタイトルでも対応できるようにしている。
echo "NEW_VERSION=$NEW_VERSION" >> $GITHUB_ENV
の部分では次のステップで環境変数$NEW_VERSION
が使用できるよう、GitHubActionsで用意されている環境ファイルに書き込んでいる。
Version up
pubspec.yaml
のバージョン指定箇所で新しいバージョンに書き換えをおこなっている。この書き換えはciderパッケージを使っても可能だが、セットアップ処理が余計にかかってしまうのでsed
で行うようにした。
run: |
sed -i -e "6 s/.*/version: $NEW_VERSION/" pubspec.yaml
pubspec.yaml
の6行目がバージョン記述箇所なので行数を指定しているが、それが変更された際は正常に動かなくなってしまうので、行の先頭がversion:
で始まる行をsed
するような処理に書き換えてもよさそう。
Create pull request
最後にPullRequestを作成している。
uses: peter-evans/create-pull-request@v4
with:
title: ':arrow_up: v${{ env.NEW_VERSION }}'
body: 'v${{ env.NEW_VERSION }}'
commit-message: ':arrow_up: v${{ env.NEW_VERSION }}'
base: develop
branch: feature/v${{ env.NEW_VERSION }}
ここではpeter-evans/create-pull-request@v4
というActionを利用させていただいた。
PRのタイトルや本文、コミットメッセージなどを設定できる。他にも設定できる項目はたくさんあるので公式ドキュメントを参照してほしい。
完成
これで動くはず。developブランチからmainブランチに対し、タイトルをRelease v1.2.1
でPRを作成する。
すると無事にGitHubActionsが動き出し、期待通りのPullRequestが作成された。
ちゃんとバージョンも更新されている。
おわり
これでまた一つ世界から単純作業が消えた。