839の日記

趣味の話を書くブログです。

GitHub Actionsライブラリのリリースを自動化する

action-slackというGitHub ActionsでSlack通知を行えるライブラリのリリースを自動化した。 package.jsonのバージョンを更新し、npm i を行ってmasterにpushすると変更されたバージョンでリリース作成まで行う。 流れとしては以下のような形。

  1. 各ブランチにpushした際に単体テストJobが走る
  2. 1のブランチがmasterかつ単体テストが通っていたらリリース準備Jobが走る
  3. package.jsonおよびpackage-lock.jsonを見てバージョンが変わっていた場合はリリース準備を行う
  4. 3でリリース準備を行った場合はリリースを作成(actions/create-release)する

手っ取り早くコードを見たい人は以下のリンクからどうぞ。

最初に悩んだのはGitHub Actionsのワークフロー内でコードをpushしたりタグをつけた場合は他のワークフローが発火しないということ。 例えばタグをpushするとactions/create-releaseがリリースを作成するワークフロー(WF A)があったときに、別のワークフローでタグをつけてpushしてもWF Aは発火しない。 これを回避するためにはPersonal Access Tokenを使うと回避できると記載されている。
refs: Events that trigger workflows - GitHub Docs

prepare-release Jobでは以下の処理を行っている。

  • 「ifでmasterブランチを限定」し、needsで「test Jobが成功したこと」を保証する
  • GITHUB_TOKEN にPersonal Access Tokenを指定して、actions/create-releaseが記載されているワークフローが発火させる
  prepare-release:
    if: contains(github.ref, 'master')
    needs: [test]
    runs-on: ubuntu-latest
    steps:
     ...
      - run: npm run prepare-release
        env:
          GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}

自分の場合は npm run prepare-release を実行するとbashスクリプトを実行し、その中で色々リリースに必要な操作を行っている。
prepare-release.sh

上記のスクリプトではpackage.jsonからバージョン情報を抽出し、メジャーバージョンを見て v3 ブランチなどにpushしつつ*1タグを付与する操作を行っている。

*1:1文字しか見てないので現状v9までしか正常に動作しない