semantic-releaseでモノレポパッケージのリリースを自動化する
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に以下を追加する
{
"scripts": {
"release": "npm run release -ws --if-present"
},
"release": {
"extends": "semantic-release-monorepo"
}
}
あとは各パッケージのpackage.jsonでsemantic-releaseを走らせる
{
"scripts": {
"release": "npx semantic-release"
}
}
プラグインなどは好きなようにルートに設定すればOK。CI設定もルートでnpm i && npm run release
を打つだけなのでほぼ変わらない。
もしsemantic-release導入前に手動でパッケージリリースしているなら、そのリリースに対応したコミットにタグをつける必要がある。
例えばコミット123abc
でpackage-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に型付けするライブラリを作っているので試してくれると喜びます。
Discussion