🌊

semantic-releaseでモノレポパッケージのリリースを自動化する

2021/11/12に公開

semantic-releaseをモノレポで使おうとしてはまったので備忘録として書く。
semantic-releaseを使うことでSemantic Versioningに沿ったリリースを、自動で、コミットメッセージから作ってくれる。
GithubでホスティングとCI/CDして、npmにリリースするが、js以外のパッケージでもほかのレジストリでも使える。
semantic-releaseは1リポジトリ1パッケージの前提で動くので、モノレポは設定が必要。
基本的には、各パッケージでsemantic-releaseを走らせて、自分のパッケージを変更したコミットのみを参照するという方法で動く。

npm workspaceを使う。

How to

まずインストール。ルートでやればOK。個別パッケージでやる必要はない。(node_modulesの仕様でたまたま動いてるだけでほんとはインストールした方がいい説はある。とりあえず動くのでヨシ!)

npm install -D semantic-release semantic-release-monorepo

ルートのpackage.jsonに以下を追加する

./package.json
{
    "scripts": {
        "release": "npm run release -ws --if-present"
    },
    "release": {
        "extends": "semantic-release-monorepo"
    }
}

あとは各パッケージのpackage.jsonでsemantic-releaseを走らせる

./package-a/package.json
{
    "scripts": {
        "release": "npx semantic-release"
  }
}

プラグインなどは好きなようにルートに設定すればOK。CI設定もルートでnpm i && npm run releaseを打つだけなのでほぼ変わらない。

もしsemantic-release導入前に手動でパッケージリリースしているなら、そのリリースに対応したコミットにタグをつける必要がある。
例えばコミット123abcpackage-aのバージョン1.2.3をリリースしたなら

git tag package-a-v1.2.3 123abc
git push package-a-v1.2.3 origin

としてsemantic-releaseに教える。(デフォルト設定だとv1.2.3だけでいいが、これだとモノレポでタグが衝突するので、semantic-release-monorepoによって変更されている)

他の設定は公式ドキュメントに書いてある通り。

宣伝と感想

マジでリリース楽になったので良かったです。
この方法を使ってfirefuseという、firestoreに型付けするライブラリを作っているので試してくれると喜びます。

https://github.com/Hagihara-A/fire-fuse

Discussion