kakudooo docs

Renovateの設定をローカル環境でデバッグする方法

renovate.jsonpackageRulesに定義の追加/変更を行なった際、都度リモートホストでのRenovateの実行を待って結果の確認を行なっていた。この方法だと、設定内容に対するPull Requestの作成結果が分かるまでに時間がかかる。

プロジェクトによってはpackageRulesgroup機能を使い、依存関係を運用ルールに合わせて特定のグループにまとめる必要があったりするので、定義にあたって色々と試行錯誤することになる。そうなると変更後、手元のローカル環境でデバッグをしておきたくなる。

調べたところ、手元のrenovate.jsonに対してデバッグを行う機能がいくつか提供されていることがわかったので、調べたら内容について書いておくことにする。

デバッグの方法

調べたところ、以下の方法でデバッグできることが分かった。

renovate-config-validatorを使う方法

renovate-config-validatorというツールが公式から提供されており、renovate.jsonの定義内容をバリデーションしてくれる。

以下は、実行例。

npx --yes --package renovate -- renovate-config-validator

Config Validationを参照。

Renovateをローカルでdry runする方法

Renovate CLI--platform=localフラグ付きで実行することで、ローカル環境でRenovateをdry runできる。デバッグ用途の機能としてサポートされている。

ブランチやPRの作成に至る手前までの処理を実際に実行するため、renovate-config-validatorに比べて、実際の挙動に近い形でデバッグが可能。

LOG_LEVEL=debug npx renovate --platform=local

Localを参照。

groupingのデバッグ

冒頭で特に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 updates section where you can see the branch name based on groupName.
If you run in dryRun mode, the whole branch creation will be skipped and you will only get logs.

とのことなので、「Renovateをローカルでdry runする」方法でログを出力してみる。

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

例: 出力結果

のように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"
      }
    ]
  }
]

参考