pubパッケージリリース用のワークフローを組んだ時のメモ

## はじめに

最近Github Actionsからpub.devへのパッケージ公開ができることを知ったのでやってみました。（結構前からできるらしい？）

他のactionも組み合わせて個人のパッケージにはちょうどいいのでは？って感じの構成にしてみました。

## セットアップ

### tagprの用意

リリースブランチにpushされるとリリースPRを作り、リリースPRがマージされるとtagを打ったりしてくれるactionです。

https://github.com/Songmu/tagpr

以下のファイルを用意しました。

tagprの設定ファイルです。
commandで次に紹介するMakefileを実行するようにしている以外は普通です。
```.tagpr
[tagpr]
	releaseBranch = main
	versionFile = -
	vPrefix = false
	command = "make prerelease_for_tagpr"
```

tagprがリリースPRを作るタイミングでpubspec.yamlのバージョンを更新するようにしています。
```makefile:Makefile
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を打つようにしてます。

```yaml:.github/workflows/tagpr.yaml
# .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のワークフロー

基本はこれ通りやれば動きます。

https://dart.dev/tools/pub/automated-publishing

今回flutter sdkへの依存があるパッケージだったので、flutterのセットアップが増えています。
ちょっとややこしいところとして、OIDCの用意のためにsetup-dartが必要です。

```yaml:.github/workflows/tagpr.yaml
# .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）

https://github.com/K9i-0/riverpod_paging_utils/pull/12

あとはリリースブランチをマージするとpub.devに公開されます。

## minor、majorを上げる時の注意

Automatically delete head branchesを有効にしてると、リリースPRのブランチが消えるタイミングの問題でchangelogの更新がうまくいかないかもです。（確認が不十分で確証が無い）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2542067/f1f7ce28-3529-80f6-852f-2995ace44067.png)

tagpr-from-*をprotected branchにしつつallow force pushsすると一応回避できそうでした。

## まとめ

リリースが楽になりそうです。
こちらのリポジトリに設定してるので参考にどうぞ

https://github.com/K9i-0/riverpod_paging_utils