GitHub Actionsライブラリのリリースを自動化する
action-slackというGitHub ActionsでSlack通知を行えるライブラリのリリースを自動化した。
package.jsonのバージョンを更新し、npm i
を行ってmasterにpushすると変更されたバージョンでリリース作成まで行う。
流れとしては以下のような形。
- 各ブランチにpushした際に単体テストJobが走る
- 1のブランチがmasterかつ単体テストが通っていたらリリース準備Jobが走る
- package.jsonおよびpackage-lock.jsonを見てバージョンが変わっていた場合はリリース準備を行う
- 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までしか正常に動作しない