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