【Flutter】自作パッケージの運用とリリースをGithub Actionsでちょっと楽に

# 背景
先日Flutterで点線を描画できるカスタムWidget、[dotted_line](https://pub.dev/packages/dotted_line)を公開しました！
さて、公開後は運用が始まるわけですが、機能が限定的で概ね必要な機能は揃っているので、そこまで更新頻度は高くないだろうと予想しています。
頻繁に行わない作業というのは忘れがちで、実施する度に手順書を探したりググったりして余計な手間がかかってしまいます。
そのため、Github Actionsを使ってリリース前チェックやリリース作業をあらかじめ自動化させておこうと思ったのが今回の背景です。

# 対象読者
今回は自作パッケージを現在作成中である、もしくは既に公開済みである方を対象としています。
自作パッケージの実装方法についてはご紹介していません、ご了承ください。

# 運用フローと自動化する作業
まずは自動化の前に運用フローを整理しました。
★を付けたところが今回の自動化対象です。

- developブランチで開発（コントリビュータからのPRなどもdevelopヘマージ）
- 今回のリリースで必要な開発が終わり次第masterへのPRを作成
- ★pub.devへのパッケージアップロードに必要なファイルの更新忘れがないかチェック
- 問題なければmasterにdevelopをマージ
- 今回のリリースのタグをプッシュ
- ★pub.devへパッケージをアップロード & Githubのリリース作成

# pub.devへのパッケージアップロードに必要なファイルの更新忘れがないかチェック
パッケージリリース時には下記のファイルの更新が必要です。

- pubspec.yaml(パッケージのバージョンを上げる必要がある)
- CHANGELOG.md(新バージョンの変更内容を記載する必要がある)

これらのファイルの更新を忘れていないかチェックするために、[Danger](https://danger.systems/ruby/)を用いてPR作成時に警告コメントを表示するようにしました。（Danger導入については公式サイトをご参照ください。）
（もしチーム開発など複数人での運用を想定するのであれば、上記ファイルの該当行が更新されていなければPRのマージを不可にするくらいのことをやった方がよさそうですが、今回は個人での運用になるのでファイル更新が必要であることに気付ければいい程度の温度感だったため、警告コメントを残すのみにしました。）

Dangerの実行結果はこのような感じになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136368/e38c9523-242f-bcea-7bbc-a5424a453d6f.png)

Github Actionsのファイルはこちら

```yaml:check.yml
name: Pre-release check

on:
  pull_request:
    branches:
      - master

jobs:
  check:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Set up Ruby
        uses: actions/setup-ruby@v1
        with:
          ruby-version: 2.6.x

      - name: Danger
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          gem install bundler
          bundle install
          danger
```

Dangerfileはこちら

```ruby:Dangerflie
warn("Did you update your pubspec.yaml version before the release?", file: "pubspec.yaml", line: 3)
warn("Have you added the new version to CHANGELOG.md?", file: "CHANGELOG.md", line: 1)
```

# pub.devへパッケージをアップロード & Githubのリリース作成
タグのプッシュをトリガーにして、pub.devへのアップロードコマンドを実行します。
Github Actions上で`pub publish`コマンドを実行する方法は、下記の記事を参考にさせていただきました。
https://medium.com/evenbit/publishing-dart-packages-with-github-actions-5240068a2f7d

また、pub.devへのアップロードが完了次第、Githubのリリースを作成します。

Github Actionsのファイルはこちら

```yaml:publish.yml
name: Publish package to pub.dev

on:
  push:
    tags: 
      - 'v*'

jobs:
  publish:
    runs-on: ubuntu-latest
    container:
      image:  google/dart:latest
  
    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Setup credentials
        run: | 
          mkdir -p ~/.pub-cache 
          cat <<EOF > ~/.pub-cache/credentials.json
          {
            "accessToken":"${{ secrets.CREDENTIALS_ACCESS_TOKEN }}",
            "refreshToken":"${{ secrets.CREDENTIALS_REFRESH_TOKEN }}",
            "tokenEndpoint":"https://accounts.google.com/o/oauth2/token",
            "scopes": [ "openid", "https://www.googleapis.com/auth/userinfo.email" ],
            "expiration": 1576508276459
          }
          EOF

      - name: Publish
        run: |
          pub publish -f

      - name: Create release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: ${{ github.ref }}
```

# まとめ
これで自作パッケージの更新頻度が高くなくても、更新に必要なものをググる必要もなくリリースも自動で行うことができるようになりました。
Github Actionsは非常に簡単に導入できるのでCI導入を検討されている方にはおすすめです。

# 追記（2020/06/04）
ついに初めてコントリビュータの方がPRをくれました！
この取り組みが日の目を見る機会がきてとても嬉しかったです。
Flutterやこちらの自作パッケージの運用から長らく離れていたため運用に関する多くの部分が抜け落ちていたのですが、この自動化を行なっていたお陰で難なく対応することができました！