📚

DevContainerにある.node-versionを自動で書き替えられるようにした話

2024/11/03に公開

TL;DR

  • Dockerfileの環境に合わせて.node-versionをコマンドラインで自動的に更新できるようにしたよ
  • node -vsedを組み合わせて実現しているよ

経緯

自分のホームページをAstroを用いて構築しており、開発環境にはDevContainerを利用しています。

環境のレガシー化をなんとかしたいので、
Dependabotによるアップデートプルリクをpackage.jsonDockerfileに対して作成してもらうようにしています。

ホームページのビルド時にNode.jsのバージョンを固定する目的で.node-versionファイルを作成しているのですが、
Dependabotで作成されたDockerfileに対するプルリクに合わせて.node-versionを手動で更新しているのが面倒に感じたので
Dockerfileに合わせて.node-versionを自動更新するようにしてみました。

やったこと

御託を並べましたが、先に結論を。
devcontainer.jsonpostCreateCommandに下記設定を実施しました。

devcontainer.json (抜粋)
{
  // ...略...
  "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の内容は

.node-version
22.11.0

のようにX.Y.Z形式でバージョン情報を記述します。

sedコマンドを用いて、node -vの実行結果の先頭にある「v」を削除して、.node-versionの記述形式に合わせています。

また、devcontainer.jsonpostCreateCommandに設定することで、開発用コンテナが作成された時に実行するようにできます。
何度も何度も更新するようなものではないと考えたので、このタイミングとしています。

ほか、postStartCommandpostAttachCommandがありますがこのあたりは下記サイトが参考になるかと思います。

おわりに

手動更新は忘れるリスクがあり、バージョン不一致による不具合の原因になります。
今回のように自動化することで、こうしたリスクの低減に繋げられるので嬉しいですね。

なお、環境やニーズによって異なる自動化方法もあるので、これは一例として参考にしていただければ幸いです。
ご覧いただきありがとうございました。

Discussion