なまえは まだ ない

思いついたことをアウトプットします

Pull Request がマージされると自動的にタグを打ってリリースを作るGitHub Actionsワークフローを書いた話

前置き

僕が所属してる吹奏楽団体には(当然ながら)会員規約というものがあります。こういった規約って時々改訂されるけど、何が変わったのかその差分がわからないのって気持ち悪くないですか?知らぬ間に僕らに不利な条項が増えたらどうしよう!と思ってしまうわけです。団体で事務系の管理をしている友人にその話をしたところ、GitHubリポジトリを作ってくれました。

github.com

規約が更新されたらこのリポジトリにPull Requestを送ります。バージョン管理すればどこがいつ変わったか丸わかり!ヤッタネ!!

どうせならリリースも作ったほうが良くない?

さて、ニンゲンは欲張りな生き物なのでドンドン要求が増えるわけです。 どうせGitHubで管理するならタグを打ってしまいましょう。タグを元にリリースを作れば「最新の規約はこれです!」とかそんな共有が簡単になります。 ただし規約の改訂なんてそんな頻繁にやる作業じゃないので、タグ打ってリリース作って……なんて作業をいざ更新するというときに手作業でやってたら絶対ミスります。こういう定形作業こそGitHub Actionsを使いましょう。

自動でタグを打ってリリースまで作るワークフロー

実際に動いているものは上に貼ったリポジトリを見てもらえば早いですが、せっかくなのでここにも書いておきます。

name: release

on:
  push:
    branches:
      - master
    paths:
      - terms.txt

jobs:
  release:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Repository
        uses: actions/checkout@v2

      - name: Setup Environment
        run: |
          version=$(TZ='Asia/Tokyo' date +v%Y-%m-%d)
          title=$(git log -1 --merges --pretty=format:"%b")
          echo "::set-env name=TAG::${version}"
          echo "::set-env name=TITLE::${title}"
      - name: Create New Tag
        run: |
          git config user.name 'GitHub Actions'
          git config user.email 'actions@github.com'
          git tag $TAG
          git push --tags
      - name: Create New Release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ env.TAG }}
          release_name: ${{ env.TAG }}
          body: ${{ env.TITLE }}
          draft: false
          prerelease: false

ポイントはGitHub Actionsでタグのプッシュからリリース作成まで一気にやってるところです。 タグがプッシュされたらリリースが作成されるようなワークフローはよく見かけますが、タグそのものを作成するような例は中々見つけられませんでした。 GitHub Actionsは自身のリポジトリにプッシュできるトークンを持ってます。が、プッシュするためには最低限のGit設定(user.name, user.email)が必要なので、テキトーな情報を設定しています。

あとはタグ名ですか。 規約がいつ改訂されたのか一発でわかるように、改訂日(正確には、Pull Requestのマージ日)でタグを打つようにしています。 さすがに一日2回改訂が行われることはないでしょうから、 yyyy-mm-dd の形式にしておけば十分でしょう。 我々は日本で活動しているので、改訂日も日本時間に合わせておいた方が都合が良いです。 TZ 環境変数に日本のタイムゾーンを設定することで、 date コマンドの出力が日本時間になるようにしました。

TZ='Asia/Tokyo' date +v%Y-%m-%d

パフォーマンス

タグを打つ場所はコマンドだけで実現してるので高速です。実際に動かしてみたところ7秒で終わりました。

Merge pull request #8 from winds-nagaoka/release-2020-05-17 · winds-nagaoka/terms@c0e77c6 · GitHub

リリースを作るところは actions/create-release を利用していますが、これも1秒で終わってます。早い!

github.com

まとめ

というわけで、Pull Requestがマージされた日付を元にタグを打ってGitHubのリリースを作成するGitHub Actionsワークフローを書きました。僕なりに良い感じに書けたと満足してます。もっと良い感じの実装があればぜひ教えてください。