stefafafan の fa は3つです

"すてにゃん" こと id:stefafafan のブログです

Renovate で Dockerfile 内の Node.js のバージョンも LTS版まであげてもらう

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-alpine16.17.1-alpine などにあげようとするし、最終的にはその時の最新(この記事時点では 18.10.0-alpine ) まであげようとします。

実際にテスト用リポジトリ.node-versionDockerfile を置いて試した結果確かに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
        }
    ]
}

まず regexManagersDockerfile 内の該当する行からバージョンの番号を抽出し、そこに対して node のバージョンテンプレートを使うように指定してあげます。これでLTS版まであげてくれるようになります。

ただこれだけだと元々動いていたDockerfile向けのManagerが発動して Node.js v15 とか v17 にあげる Pull Request が変わらず作られてしまうので、 packageRules のほうでそれを無効化する、というのも必要です。