はじめに
最近Github Actionsからpub.devへのパッケージ公開ができることを知ったのでやってみました。(結構前からできるらしい?)
他のactionも組み合わせて個人のパッケージにはちょうどいいのでは?って感じの構成にしてみました。
セットアップ
tagprの用意
リリースブランチにpushされるとリリースPRを作り、リリースPRがマージされるとtagを打ったりしてくれるactionです。
以下のファイルを用意しました。
tagprの設定ファイルです。
commandで次に紹介するMakefileを実行するようにしている以外は普通です。
[tagpr]
releaseBranch = main
versionFile = -
vPrefix = false
command = "make prerelease_for_tagpr"
tagprがリリースPRを作るタイミングでpubspec.yamlのバージョンを更新するようにしています。
prerelease_for_tagpr:
@echo "Current version: $(TAGPR_CURRENT_VERSION)"
@echo "Next version: $(TAGPR_NEXT_VERSION)"
sed -i "s/version: $(TAGPR_CURRENT_VERSION)/version: $(TAGPR_NEXT_VERSION)/" pubspec.yaml
Github Appでtagを打つようにしてます。
# .github/workflows/tagpr.yml
name: tagpr
on:
push:
branches: ["main"]
jobs:
tagpr:
runs-on: ubuntu-latest
steps:
- name: Generate token
id: generate_token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ vars.APP_ID_OF_K9I_TAG_PUSHER }}
private-key: ${{ secrets.APP_PRIVATE_KEY_OF_K9I_TAG_PUSHER }}
- uses: actions/checkout@v4
with:
token: ${{ steps.generate_token.outputs.token }}
- id: tagpr
uses: Songmu/tagpr@v1
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
pub.devへのpublishのワークフロー
基本はこれ通りやれば動きます。
今回flutter sdkへの依存があるパッケージだったので、flutterのセットアップが増えています。
ちょっとややこしいところとして、OIDCの用意のためにsetup-dartが必要です。
# .github/workflows/publish.yml
name: Publish to pub.dev
on:
push:
tags:
- '[0-9]+.[0-9]+.[0-9]+*' # for tags like: '1.2.3'
# Publish using custom workflow
jobs:
publish:
permissions:
id-token: write # Required for authentication using OIDC
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# setup OIDC token
- uses: dart-lang/setup-dart@v1
# https://github.com/dart-lang/setup-dart/blob/v1/.github/workflows/publish.yml
- name: Fetch flutter config
uses: kuhnroyal/flutter-fvm-config-action@v2
id: fvm-config-action
- name: Setup Flutter
uses: subosito/flutter-action@v2
with:
flutter-version: ${{ steps.fvm-config-action.outputs.FLUTTER_VERSION }}
channel: ${{ steps.fvm-config-action.outputs.FLUTTER_CHANNEL }}
cache: true
- name: Install dependencies
run: dart pub get
- name: Publish
run: dart pub publish --force
使い方
PRのマージなどでmainブランチにpushされると、tagprがリリースブランチを作ります。
minorやmajorバージョンを上げるときはラベルを使います。(詳しくはtagprのReadme)
あとはリリースブランチをマージするとpub.devに公開されます。
minor、majorを上げる時の注意
Automatically delete head branchesを有効にしてると、リリースPRのブランチが消えるタイミングの問題でchangelogの更新がうまくいかないかもです。(確認が不十分で確証が無い)
tagpr-from-*をprotected branchにしつつallow force pushsすると一応回避できそうでした。
まとめ
リリースが楽になりそうです。
こちらのリポジトリに設定してるので参考にどうぞ