Renovateを使ってるときに、Node.jsをv15とかv17とかにあげるPull Requestが出ることがあって気になっていたところ、特定状況下だとこうなることがわかったのでブログに書いておきます。なお、Node.jsのバージョンについては
https://github.com/nodejs/Release#release-plan に詳しく書いてあります。
Dockerfile内で FROM node:16-alpine のように数字のあとに文字がついてる場合はLTSを無視してアップデートしようとする
ほぼほぼ以下のDiscussionに書いてある通りです。
github.com
例えば .node-version
ファイルがあって 14.20.1
と書いてあるとしたら、Renovateはこれを 16.17.1
にあげるPull Requestを作ってくれます。(v15は飛ばしてくれて、最終的には現行のLTSまであげてくれます)。
一方で Dockerfile
を置いていて、中に FROM node:14.20.1-alpine
という記述がある場合、Renovateはこれを 15.14.0-alpine
や 16.17.1-alpine
などにあげようとするし、最終的にはその時の最新(この記事時点では 18.10.0-alpine
) まであげようとします。
実際にテスト用リポジトリに .node-version
と Dockerfile
を置いて試した結果確かにDockerfile
だけLTSを無視してあげられていました。
現状の対処法はRegex Managerを使うこと
Discussionの解答にもあるように、以下のような設定を renovate.json
に書くと解消されました。
{ "$schema": "https://docs.renovatebot.com/renovate-schema.json", "regexManagers": [ { "fileMatch": ["^*Dockerfile$"], "matchStrings": ["FROM node:(?<currentValue>.*?)-.*\\n"], "depNameTemplate": "node", "datasourceTemplate": "node", "versioningTemplate": "node" } ], "packageRules": [ { "matchPackageNames": ["node"], "matchManagers": ["dockerfile"], "enabled": false } ] }
まず regexManagers
で Dockerfile
内の該当する行からバージョンの番号を抽出し、そこに対して node
のバージョンテンプレートを使うように指定してあげます。これでLTS版まであげてくれるようになります。
ただこれだけだと元々動いていたDockerfile向けのManagerが発動して Node.js v15 とか v17 にあげる Pull Request が変わらず作られてしまうので、 packageRules
のほうでそれを無効化する、というのも必要です。