DevContainerにある.node-versionを自動で書き替えられるようにした話
TL;DR
-
Dockerfile
の環境に合わせて.node-version
をコマンドラインで自動的に更新できるようにしたよ -
node -v
とsed
を組み合わせて実現しているよ
経緯
自分のホームページをAstroを用いて構築しており、開発環境にはDevContainerを利用しています。
環境のレガシー化をなんとかしたいので、
Dependabotによるアップデートプルリクをpackage.json
、Dockerfile
に対して作成してもらうようにしています。
ホームページのビルド時にNode.jsのバージョンを固定する目的で.node-version
ファイルを作成しているのですが、
Dependabotで作成されたDockerfile
に対するプルリクに合わせて.node-version
を手動で更新しているのが面倒に感じたので
Dockerfile
に合わせて.node-version
を自動更新するようにしてみました。
やったこと
御託を並べましたが、先に結論を。
devcontainer.json
のpostCreateCommand
に下記設定を実施しました。
{
// ...略...
"postCreateCommand": "npm install && (node -v | sed 's/^.\\{1\\}//' > .node-version)",
// ...略...
}
npm install
コマンドは今回関係がなく(すみません)、本丸は(node -v | sed 's/^.\{1\}//' > .node-version)
の部分です。
やっていることはなんでもないことで、node -v
コマンドで得られる文字列の先頭1文字を削除して.node-version
に書き込んでいるだけです。
というのも、node -v
で得られるバージョン情報と.node-version
に記述するバージョン情報では形式がほんの少し違うのです。
node -v
を実行すると、
$ node -v
v22.11.0
というように、vX.Y.Z
形式でバージョン情報を確認することができます。
かたや、.node-version
の内容は
22.11.0
のようにX.Y.Z
形式でバージョン情報を記述します。
sed
コマンドを用いて、node -v
の実行結果の先頭にある「v」を削除して、.node-version
の記述形式に合わせています。
また、devcontainer.json
のpostCreateCommand
に設定することで、開発用コンテナが作成された時に実行するようにできます。
何度も何度も更新するようなものではないと考えたので、このタイミングとしています。
ほか、postStartCommand
やpostAttachCommand
がありますがこのあたりは下記サイトが参考になるかと思います。
おわりに
手動更新は忘れるリスクがあり、バージョン不一致による不具合の原因になります。
今回のように自動化することで、こうしたリスクの低減に繋げられるので嬉しいですね。
なお、環境やニーズによって異なる自動化方法もあるので、これは一例として参考にしていただければ幸いです。
ご覧いただきありがとうございました。
Discussion