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に関する依存関係の更新ルールを定義するために、renovate.jsonに以下のようなgroupを作成したとする。
※ 前提として、対象のリポジトリの.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"
}
]
}
]