okaryo.log

Flutterアプリのリリース直前にpubspec.yamlのバージョンを上げる作業をGitHubActionsを使って自動化する | okaryo.log

Flutterアプリのリリース直前にpubspec.yamlのバージョンを上げる作業をGitHubActionsを使って自動化する

    #Flutter#GitHub#GitHubActions#CI/CD

背景

Flutterアプリをリリースする直前に毎回pubspec.yaml内のバージョンを新しいものに差し替え、コミットしてプッシュし、PullRequestを出していた。

毎回やっていては流石に面倒で自動化したいと考えていたので今回対応してみた。

(そもそもアプリのバージョン管理をpubspec.yaml以外でやっているところあれば教えてください)

自動化処理の流れ

以下が全体の流れとなる。

  1. リリースする際はdevelopブランチからmainブランチに対してPullRequestを作成しているので、これをトリガーとして自動化処理を走らせる。
  • トリガーについては個別の運用に合わせて変えていただきたい。
  1. PullRequestのタイトルから今回のリリースで適用されるバージョンを取得する。
  2. pubspec.yaml内のバージョン記載箇所を上記で取得した新しいバージョンで書き換える。
  3. コミットして新しい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.mainmainブランチに対する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.01.2.0Release 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を作成する。

OpenPullRequest

すると無事にGitHubActionsが動き出し、期待通りのPullRequestが作成された。

CreatePullRequest

ちゃんとバージョンも更新されている。

UpdateVersion

おわり

これでまた一つ世界から単純作業が消えた。


関連記事
最新記事
プロモーション

This site uses Google Analytics.