🐔

GitHubのreleaseとtagを自動でつけたい

2021/03/18に公開

概要

最近privateドタバタしてて全然開発できてなかったけど、隙間時間で再開🤹‍♂️

GitHubでよく見るこの辺のreleaseとかtagを自動で打てたら素敵だなぁ
と前々から思ってたので、今日はこの辺調べてみ

たらすでに素敵な記事があったw
https://dev.classmethod.jp/articles/github-actions-semantic-release-sample/

基本上記記事通りやればいいだけだけど
ちょっと詰まった部分もあったのでメモ残しとく

ポイント

以下やっていく感じ

  1. main branchにpushしたらreleaseとtagを勝手に打ってもらう
    1. semantic-release
      1. コミットの命名規則を見てtagとreleaseをよろしく作成してくれる
    2. GitHub Actions
      1. masterへのpushでsemantic-release実行してくれるCI
  2. ローカルでコミットメッセージの規則性を強制する
    1. commitlint
      1. コミットの命名がsemantic-releaseの求める規則通りかチェックしてくれる
    2. husky
      1. コミット前に規則通りじゃない場合止めてくれる

semantic-releaseに準じたこんな感じのコミットメッセージ書いてくと
feat(user): add create user validation
メジャーなのかマイナーなのか勝手に判断してtag打ってrelease作成してくれる!素敵!

やったこと

semantic-release

yarn環境構築

以下コマンド実行して適当な情報入れ込んでく
(とりあえずprivateはtrueにしておく

brew install yarn
yarn init

インストールとセットアップ

semantic-releaseのpackageを開発環境用に追加

最後のsetupではnpmのpasswordは?とか聞かれたので
npmにサインアップして情報入れといた

あとはGitHubのパーソナルトークンも作成して登録
トークン作成時の権限はデフォルト状態で行けた

yarn add -D semantic-release semantic-release-cli
yarn semantic-release-cli setup

デフォルトの設定だとmaster branch見にいくから
以下ファイル作成してmainを参照するようにしたほうがよさそう

.releaserc.json
{
  "branches": ["main"]
}

GitHub Actions

設定

mainにpushしたら以下実行するように設定

  1. リポジトリの情報をcheckout
  2. node環境の作成
  3. yarnで依存package install
  4. semantic-release実行!
.github/workflows/release.yml
name: Release
on:
  push:
    branches:
      - main
jobs:
  release:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout this repository
        uses: actions/checkout@v2
      - name: Setup node
        uses: actions/setup-node@v1
        with:
          node-version: '14.16.0'
      - name: Install dependencies
        run: yarn --frozen-lockfile
      - name: Release
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: yarn semantic-release

検証

PR作ってマージ。mainにpushされると
GitHub Actionsのworkflowが動いた!

GitHub Actions workflow

tagとreleaseが勝手にできた!!

tag and release

Angular Commit Message Conventionsのtypeに準じて
major, minor, patchどのレベルのアップデートなのか判断してくれるみたい

fix(scope)はパッチ、feat(scope)はマイナー
コミットメッセージにこんな感じでBREAKING CHANGE: って含めるとメジャーバージョンが上がるみたい
BREAKING CHANGE: The graphiteWidth option has been removed.

https://github.com/semantic-release/semantic-release#commit-message-format

他のタイプは全部パッチかな?試してない。

commitlint

コミットメッセージに規則性を強制してくれる!

yarn add -D @commitlint/cli @commitlint/config-conventional

ここで適当にyarn add -D commitlintとかすると@commitlint/config-conventionalが入らなくて Please add rules to your commitlint.config.jsエラーから抜け出せないので気をつけて🤦‍♂️

以下設定ファイル追加する

.commitlintrc.json
{
  "extends": [
    "@commitlint/config-conventional"
  ]
}

こんな感じでちゃんとチェックしてくれるか確認できます!

echo "aaa(scope): test" | yarn commitlint
yarn run v1.22.10
$ /Users/su/ghq/github.com/shintaro-uchiyama/base-app/node_modules/.bin/commitlint
⧗   input: aaa(scope): test
✖   type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] [type-enum]

✖   found 1 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

husky

上で設定したcommitlintをコミットするタイミングでチェックして弾いて欲しい!そんな時のhusky
huskyインストールしてコミットメッセージチェックの設定追加

yarn add -D husky
yarn husky install
yarn husky add .husky/commit-msg "yarn commitlint --edit $1"
chmod +x .husky/commit-msg

ここまで来たらこんな感じでコミットしようとしても規則性に準じてなかったら怒られるはず!

git commit -m "wrongtype(scope): testing"
yarn run v1.22.10
$ /Users/su/ghq/github.com/shintaro-uchiyama/base-app/node_modules/.bin/commitlint --edit
⧗   input: wrongtype(scope): testing
✖   type must be one of [build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test] [type-enum]

✖   found 1 problems, 0 warnings
ⓘ   Get help: https://github.com/conventional-changelog/commitlint/#what-is-commitlint

error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
husky - commit-msg hook exited with code 1 (error)

まとめ

commitlintのとこでyarn -D commitlintしちゃってだいぶ時間を浪費したけど概ね問題なくできた🙋‍♂️
コミットメッセージにこだわり持ってる人もいるので
万人にはウケなさそうだけど、個人的には何事も勝手にやって欲しい子なのでこれは重宝しそう🧘

Discussion