こんにちは、サーバエンジニアの池脇と申します。
私の担当プロジェクトではRenovateを使って依存関係のあるパッケージのバージョン管理を行なっています。
ところが全てのパッケージがRenovateに対応しているわけではないため、対応外のパッケージが更新されると自動生成時にバージョン更新が入ってしまいノイズになってしまうことがありました。
今回はそのノイズを抑制するためにRenovate対応外のパッケージをバージョン管理できるようにします。
Renovateとは
上述の通り、プロジェクト内の依存関係にあるパッケージのバージョン管理を自動で行ってくれるツールです。自動マージも可能ですが、弊プロジェクトではPRを作成し確認後にマージする方式で運用しています。
以下のような状況を解決する手段として有用です。
- ライブラリが古いバージョンのまま運用され、固定されがちである
- 定期的にバージョンを手動でチェックして更新している
Renovate対象外のバージョン管理はどうやるのか?
最初に書いた通り、今回はRenovateに対応していないパッケージのバージョン管理を行います。(今回Renovateの使い方については解説しないため、気になる方は公式等をご確認ください)
どのように対応するのか、まずは実際の管理対象(buf.gen.yaml
)と設定ファイル(renovate.json
)から抜粋したものをご覧ください。
version: v1
plugins:
- plugin: buf.build/protocolbuffers/go:v1.34.1 # renovate: depName=protocolbuffers/protobuf-go
out: generated
- plugin: buf.build/connectrpc/go:v1.16.2 # renovate: depName=connectrpc/connect-go
out: generated
- plugin: buf.build/bufbuild/validate-go:v1.0.4 # renovate: depName=bufbuild/protoc-gen-validate
out: generated
buf.gen.yamlから抜粋
"customManagers": [
{
"customType": "regex",
"fileMatch": ["^buf.gen.yaml$"],
"matchStrings": [
"- plugin: buf\\.build/(.*):(?<currentValue>[^\\s]+) # renovate: depName=(?<depName>[^\\s]+)"
],
"datasourceTemplate": "github-releases"
}
]
renovate.jsonから抜粋
今回はProto APIマネージドツールである「Buf」のプラグインのバージョンをRenovateで管理します。
もちろん既存では対応していないファイル形式であるためcustomManagers
を利用して対応します。
今回使用しているcustomManagers
の各オプションについては次の通りです。
-
customType
-
regex
固定 - 指定せずとも動くが警告が出るので設定しましょう
-
-
fileMatch
- 必須オプション
- 管理対象にしたいパッケージのバージョンが記載されているファイルの名前を指定
-
matchStrings
- 必須オプション
- 正規表現で管理対象にしたいパッケージのバージョンが記載されている文字列を取得
- 名前付きのキャプチャ(
<currentValue>
や<depName>
)を使用 -
<currentValue>
については必ず含める必要がある -
<depName>
はdatasource
で参照する名前をキャプチャする(今回はGitHubのリポジトリ名)
-
datasourceTemplate
-
matchString
でdatasource
をキャプチャしていない場合にこちらで指定 - 今回は
github-releases
を参照していますが、npm
等、自分の参照したいもの記載
-
上記の例のように記載することで該当するGitHubリポジトリを参照してBufプラグインのバージョンを管理することができます。
Renovateが自動的に作成しているIssueにも反映されていることが確認できました!
まとめ
今回はRenovateでサポートされていないパッケージのバージョン管理を行う方法をご紹介しました。
customManagers
を使うことで色々なファイルに対応可能なので、バージョン管理にお困りの方は是非試してみてください。
以上、池脇でした。