renovate.json のpackageRulesに定義の追加/変更を行なった際、都度リモートホストでのRenovateの実行を待って結果の確認を行なっていた。この方法だと、設定内容に対するPull Requestの作成結果が分かるまでに時間がかかる。
プロジェクトによってはpackageRulesのgroup機能を使い、依存関係を運用ルールに合わせて特定のグループにまとめる必要があったりするので、定義にあたって色々と試行錯誤することになる。そうなると変更後、手元のローカル環境でデバッグをしておきたくなる。
調べたところ、手元のrenovate.jsonに対してデバッグを行う機能がいくつか提供されていることがわかったので、調べたら内容について書いておくことにする。
調べたところ、以下の方法でデバッグできることが分かった。
renovate-config-validatorというツールが公式から提供されており、renovate.jsonの定義内容をバリデーションしてくれる。
以下は、実行例。
npx --yes --package renovate -- renovate-config-validator
Renovate CLIを--platform=localフラグ付きで実行することで、ローカル環境でRenovateをdry runできる。デバッグ用途の機能としてサポートされている。
ブランチやPRの作成に至る手前までの処理を実際に実行するため、renovate-config-validatorに比べて、実際の挙動に近い形でデバッグが可能。
LOG_LEVEL=debug npx renovate --platform=local
Localを参照。
冒頭で特にgroup機能を使った場合にデバッグをしたくなると書いた。具体的にどのようなデバッグをしたいかを説明しておく。
例えば、GitHub Actionsに関する依存関係の更新ルールについて、以下のようなgroupを作成したrenovate.jsonがあるとする。(また、対象のリポジトリの.github配下にGitHub Actionsが定義されているとする)
...
"packageRules": [
{
"groupName": "all non-major github actions dependencies",
"groupSlug": "all-minor-patch-for-github-actions",
"matchManagers": ["github-actions"],
"matchUpdateTypes": ["minor", "patch"],
"description": "GitHub Actionsのminor/patchアップデートを1つのPRにまとめる",
}
]
...
上記のルールに基づいてRenovateが実行されると、既存のどの依存関係が実際にgroupingされてくるかを手元の環境(ローカル)でデバッグしたい。
調べると、すでに同じようなissueが立てられており、grouping結果のデバッグ方法について言及されていた。
You can check the logs, particulalry the
packageFiles with updatessection where you can see the branch name based on groupName.
If you run indryRunmode, the whole branch creation will be skipped and you will only get logs.
DEBUGログに含まれる「packageFiles with updates」という項目のbranchNameがpackageRulesのgroupSlugに対応する(引用元にはgroupNameと書かれているが、対応するのはgroupSlugなはず)とのことなので、「Renovateをローカルでdry runする」方法でログを出力してみる。
GITHUB_COM_TOKEN: GitHubリポジトリ(対象の依存関係)のChange Logを取得するのに必要
RENOVATE_GITHUB_COM_TOKENで設定するのが正しいようだが、それだと動かなかったLOG_LEVEL=debug GITHUB_COM_TOKEN=$(gh auth token) npx renovate --platform=local
以下のようなログが出力される。(一部抜粋)
...
DEBUG: packageFiles with updates (repository=local)
"config": {
"github-actions": [
{
"deps": [
{
"updates": [
{
"branchName": "renovate/all-minor-patch-for-github-actions"
}
]
}
]
}
]
}
...
各依存関係のbranchNameのサブディレクトリと、renovate.jsonでgroupSlugに指定した名前が一致している。
group機能の定義を変更した場合は、上記ログのbranchNameから期待した依存関係でgroupingされているかを確認するとよいことが分かる。
dry runで出力されるログを集計して、Pull Request(branch)の単位で依存関係のgrouping結果を確認できるようにしてみる。
jsonl形式でログファイルを作成する。
LOG_LEVEL=debug GITHUB_COM_TOKEN=$(gh auth token) RENOVATE_LOG_FILE=renovate-logs.jsonl npx renovate --platform=local
jqコマンドでbranchName毎に依存関係をまとめる。(codexに作ってもらった)
jq -s '
[
.[]
| (.config // {})
| to_entries[]
| (.value | arrays[]? | objects) as $package
| ($package.deps // [])[] as $dep
| ($dep.updates // [])[] as $update
| select(($update.branchName // "") != "")
| {
branchName: $update.branchName,
dependency: (
{
depName: $dep.depName,
packageName: $dep.packageName,
packageFile: $package.packageFile,
currentValue: $dep.currentValue,
datasource: $dep.datasource,
depType: $dep.depType,
updateType: $update.updateType,
newValue: ($update.newValue // $update.newVersion)
}
| with_entries(select(.value != null))
)
}
]
| sort_by(.branchName)
| group_by(.branchName)
| map({
branchName: .[0].branchName,
dependencies: map(.dependency)
})
' renovate-logs.jsonl
例: 出力結果
renovate/actions-checkout-6.xrenovate/all-minor-patch-for-github-actionsのようにbranchName毎にgroupingされた依存関係を確認することができた。
[
{
"branchName": "renovate/actions-checkout-6.x",
"dependencies": [
{
"depName": "actions/checkout",
"packageName": "actions/checkout",
"packageFile": ".github/workflows/main.yml",
"currentValue": "v4.3.1",
"datasource": "github-tags",
"depType": "action",
"updateType": "major",
"newValue": "v6.0.2"
}
]
},
{
"branchName": "renovate/all-minor-patch-for-github-actions",
"dependencies": [
{
"depName": "actions/checkout",
"packageName": "actions/checkout",
"packageFile": ".github/workflows/pinact.yml",
"currentValue": "v6.0.1",
"datasource": "github-tags",
"depType": "action",
"updateType": "patch",
"newValue": "v6.0.2"
}
]
}
]