[Flutter] pub.devデプロイ自動化

[Flutter] pub.devデプロイ自動化

2023-08-31 hit count image

Fltuter用で開発したパッケージをGitHub Actionsを使ってpub.devデプロイを自動化する方法について説明します。

概要

Flutterでアプリを開発すると、共通ライブラリまたはオープンソース化のためパッケージ(Package)を作ってhttps://pub.dev/へデプロイする時があります。

以前のブログポストではFlutterで必要なパッケージを作成してpub.devへデプロイする方法について説明しました。

今回のブログポストではpub.devへデプロイされたパッケージをGitHub Actionsを使って自動でpub.devへデプロイする方法について説明します。

Automated publishingアクティブ

pub.devへデプロイされたパッケージをGitHub Actionsを使って自動でデプロイするためにはpub.devAutomated publishingオプションをアクティブにする必要があります。

ブラウザでhttps://pub.dev/ページを開いて、デプロイ自動化をしたいパッケージのページに移動します。

Automate publishing package - pub.dev package page

自分が所有してるパッケージなら上にAdminActivity logタブがアクティブになってることが確認できます。次はAdminタブを選択して管理者ページに移動します。

Automate publishing package - automated publishing option

管理者ページでスクロールして下に行くとAutomated publishingオプションを確認することができます。Enable publishing from GitHub Actionsを選択してオプションをアクティブにします。

その後、Repositoryに当該パッケージのコードを保存してあるGitHubのレポジトリをowner/repository形式て入力します。

私は下記のようなパッケージを持ってます。

従って、Repositoryにはdev-yakuza/bullを入力しました。

次は、デプロイに使うGit Tag形式をを指定します。普通はパッケージをデプロイするためv2.5.7と言う形式のGit Tagを使います。なので、特別な理由がなければそのままこのタグを使います。

GitHub Actions作成

GitHub Actionsを使ってpub.devにパッケージを自動でデプロイする準備ができました。次はExample workflowを参考してGitHub Actionsを作成する必要があります。

Automate publishing package - GitHub Actions example workflow

または下記のリンクを参考して作成することができます。

私は.github/workflows/release.ymlファイルを生成して次のようにGitHub Actiosnを作成して使ってます。

name: Release

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
  release:
    permissions:
      contents: write
      pull-requests: write
      id-token: write
    runs-on: ubuntu-latest
    steps:
      - name: Get semantic version
        id: semver
        run: echo "::set-output name=version::${GITHUB_REF#refs/tags/v}"

      - uses: actions/checkout@v3
        with:
          ref: v$

      # For Flutter package
      - uses: dart-lang/setup-dart@v1
      - uses: subosito/[email protected]
        with:
          flutter-version: '3.7.12'
      - name: Install dependencies
        run: flutter pub get

      - name: Publish
        run: flutter pub publish --force

      # For Dart package
      # - uses: dart-lang/setup-dart@v1
      # - name: Install dependencies
      #   run: dart pub get
      # - name: Publish
      #   run: dart pub publish --force

このように作成したGitHub Actionsは次のコマンドを使って実行することができます。

git tag v2.5.7
git push origin v2.5.7

問題点

以前のブログポストでも説明しましたが、パッケージをpub.devへデプロイするためにはCHANGELOG.mdファイルとpubspec.yamlファイルにあるversionが一致する必要がありますし、pub.devへデプロイされたことないバージョンを使う必要があります。

CHANGELOG.mdファイルとpubspec.yamlファイルのバージョン内容を修正してGitHubにコミットした後、Git Tagコマンドでpub.devへデプロイすることができますが、これは100%自動化と言えないです。

Changelog自動化

この問題を解決するためGitHubRelease noteを自動化してCHANGELOG.mdファイルを自動でアップデートさせる必要があります。GitHub Actionsを使ってRelease noteCHANGELOG.mdファイルのアップデートを自動化する方法については下記のリンクを参考してください。

上のリンクを参考してRelease noteCHANGELOG.mdファイルを自動化することができます。私はCHANGELOG.mdファイルの自動化は下記のように.github/workflows/release.ymlファイルを修正して使ってます。


name: Release

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
  release:
    permissions:
      contents: write
      pull-requests: write
      id-token: write
    runs-on: ubuntu-latest
    steps:
      - name: Get semantic version
        id: semver
        run: echo "::set-output name=version::${GITHUB_REF#refs/tags/v}"

      - uses: actions/checkout@v3
        with:
          ref: v${{ steps.semver.outputs.version }}

      - uses: release-drafter/release-drafter@v5
        id: target_release_notes
        with:
          tag: ${{ steps.semver.outputs.version }}
          name: ${{ steps.semver.outputs.version }}
          version: ${{ steps.semver.outputs.version }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Update Changelog
        uses: stefanzweifel/changelog-updater-action@v1
        with:
          latest-version: ${{ steps.target_release_notes.outputs.tag_name }}
          release-notes: ${{ steps.target_release_notes.outputs.body }}

      - name: Commit updated Changelog
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: 'docs: Update changelog'
          file_pattern: CHANGELOG.md
          branch: main

      - uses: dart-lang/setup-dart@v1
      - uses: subosito/[email protected]
        with:
          flutter-version: '3.7.12'
      - name: Install dependencies
        run: flutter pub get

      - name: Update version
        run: dart run bull pub_version --version=${{ steps.semver.outputs.version }}

      - name: Commit updated pubspec
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: 'chore: Update version for release'
          file_pattern: pubspec.yaml
          branch: main

      - name: Update Git tag
        run: |
          git tag ${{ github.ref_name }} -f
          git push origin ${{ github.ref_name }} -f

      - uses: release-drafter/release-drafter@v5
        with:
          tag: ${{ steps.semver.outputs.version }}
          name: ${{ steps.semver.outputs.version }}
          version: ${{ steps.semver.outputs.version }}
          publish: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Publish
        run: flutter pub publish --force

pubspec.yamlのversionアップデート

pubspec.yamlversionをアップデートするためBullパッケージを使ってます。

下記のコマンドを使ってBullパッケージをインストールします。

dart pub add --dev bull

その後、.github/workflows/release.ymlファイルを次のように修正します。


name: Release

on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
  release:
    permissions:
      contents: write
      pull-requests: write
      id-token: write
    runs-on: ubuntu-latest
    steps:
      - name: Get semantic version
        id: semver
        run: echo "::set-output name=version::${GITHUB_REF#refs/tags/v}"

      - uses: actions/checkout@v3
        with:
          ref: v${{ steps.semver.outputs.version }}

      - uses: release-drafter/release-drafter@v5
        id: target_release_notes
        with:
          tag: ${{ steps.semver.outputs.version }}
          name: ${{ steps.semver.outputs.version }}
          version: ${{ steps.semver.outputs.version }}
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Update Changelog
        uses: stefanzweifel/changelog-updater-action@v1
        with:
          latest-version: ${{ steps.target_release_notes.outputs.tag_name }}
          release-notes: ${{ steps.target_release_notes.outputs.body }}

      - name: Commit updated Changelog
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: 'docs: Update changelog'
          file_pattern: CHANGELOG.md
          branch: main

      - uses: dart-lang/setup-dart@v1
      - uses: subosito/[email protected]
        with:
          flutter-version: '3.7.12'
      - name: Install dependencies
        run: flutter pub get

      - name: Update version
        run: dart run bull pub_version --version=${{ steps.semver.outputs.version }}

      - name: Commit updated pubspec
        uses: stefanzweifel/git-auto-commit-action@v4
        with:
          commit_message: 'chore: Update version for release'
          file_pattern: pubspec.yaml
          branch: main

      - name: Update Git tag
        run: |
          git tag ${{ github.ref_name }} -f
          git push origin ${{ github.ref_name }} -f

      - uses: release-drafter/release-drafter@v5
        with:
          tag: ${{ steps.semver.outputs.version }}
          name: ${{ steps.semver.outputs.version }}
          version: ${{ steps.semver.outputs.version }}
          publish: true
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Publish
        run: flutter pub publish --force

修正した内容は下記のようにBullパッケージを使ってpubspec.yamlversionをアップデートするコードと修正したpubspec.yamlファイルをコミットするコードです。

...
- name: Update version
  run: dart run bull pub_version --version=$

- name: Commit updated pubspec
  uses: stefanzweifel/git-auto-commit-action@v4
  with:
    commit_message: 'chore: Update version for release'
    file_pattern: pubspec.yaml
    branch: main
...

Bullパッケージの使い方に関しては下記のリンクを参考してください。

完了

これでFlutter用で開発したパッケージをGitHub Actionsを使って自動でpub.devにデプロイする方法についてみてみました。Flutter用オープンソースや共通パッケージを作ってデプロイしてある場合、ここで紹介した方法を使ってpub.devデプロイを自動化してみてください。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

アプリ広報

今見てるブログを作成たDekuが開発したアプリを使ってみてください。
Dekuが開発したアプリはFlutterで開発されています。

興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。

Posts