概要
Flutter
でアプリを開発すると、共通ライブラリまたはオープンソース化のためパッケージ(Package)を作ってhttps://pub.dev/へデプロイする時があります。
以前のブログポストではFlutter
で必要なパッケージを作成してpub.dev
へデプロイする方法について説明しました。
今回のブログポストではpub.dev
へデプロイされたパッケージをGitHub Actions
を使って自動でpub.dev
へデプロイする方法について説明します。
Automated publishingアクティブ
pub.dev
へデプロイされたパッケージをGitHub Actions
を使って自動でデプロイするためにはpub.dev
でAutomated publishing
オプションをアクティブにする必要があります。
ブラウザでhttps://pub.dev/ページを開いて、デプロイ自動化をしたいパッケージのページに移動します。

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

管理者ページでスクロールして下に行くと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
を作成する必要があります。

または下記のリンクを参考して作成することができます。
私は.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自動化
この問題を解決するためGitHub
のRelease note
を自動化してCHANGELOG.md
ファイルを自動でアップデートさせる必要があります。GitHub Actions
を使ってRelease note
とCHANGELOG.md
ファイルのアップデートを自動化する方法については下記のリンクを参考してください。
- [GitHub Actions] Pull requestのタイトル検査
- [GitHub Actions] Release Drafterを使ってGitHubのRelease noteの自動化をする
- [GitHub Actions] Pull requestのラベル検査
- [GitHub Actions] Changelogファイルの自動アップデート
上のリンクを参考してRelease note
とCHANGELOG.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.yaml
のversion
をアップデートするため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.yaml
のversion
をアップデートするコードと修正した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で開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。