nado

semantic-releaseとrenovateを併用しているプロジェクトで気をつけること

2022.09.30

はじめに

先日、sd-tailwindcss-transformerというライブラリをリリースしました。
このライブラリを作成するにあたってsemantic-releaseとrenovateを利用していたのですが、少し問題が起きてしまったので問題の内容と対処法をこの記事で残しておきたいと思います。

semantic-releaseとは

semantic-releaseとはコミットメッセージのprefixをもとにパッケージのバージョンの更新やRelease Noteの作成などを実行してくれるライブラリです。 具体的にはprefixがfixだったらFix Release、featだったらFeature Releaseになります。
コミットメッセージのフォーマットはAngular Commit Message Conventionsを踏襲しているようです。

今回、ライブラリの作成においてはgithub actionsを利用しmainブランチに対象のコミットがされたらバージョンが更新されるように設定していました。

renovate

renovateは依存パッケージに更新があった場合、それを検知して自動でpull requestを作成してくれるgithub appです。 今回はautomergeを有効にして依存パッケージの更新がminorかpatchだったら自動でmainブランチにマージするようにしていました。

起こった問題

文脈から予想はつくかと思いますが、
今回起きた問題はrenovateが作成したコミットのprefixがfixになっていたためそのpull requestがauto mergeされた結果、semantic-releaseによって意図せずバージョンが上がってしまったというものでした。

renovateはデフォルトではprefixにchoreを使用しますが、設定ファイルのオプションで"extends": ["config:base"]を設定している場合は、production dependenciesの更新のみfixが使われるみたいです。
今回はまさにこのケースでした。

対処法

automergeを無効にするという対処法もありますが、minorやpatchなどの更新がある度に毎回手動でマージするのはやはり面倒でした。

"extends": ["config:base"]を設定している場合でもprefixがchoreでコミットされるように設定できれば良いので、ドキュメントを漁ってみたところsemanticCommitTypeというオプションがありました。

このオプションの値をchoreに設定することでprefixが全てchoreでコミットされるようになりました。

まとめ

今回は個人開発だったので意図せずバージョンが上がったことによる影響はほとんどありませんでしたが、ある程度の規模で影響範囲が大きいプロジェクトで使う場合は気をつけないといけないと思いました。