Node.js バージョンを 22 にバンプ
Rails の Buildkite 環境で使用する Node.js を 18 から 22 に更新し、パッケージピンと CI パイプラインのブランチラベルを調整しました。これにより、古いランタイムの保守コストを削減し、将来的なバージョン移行の基盤を整えます。
背景
Node.js 18 のバージョンピンは 時代遅れとなり、セキュリティパッチやパフォーマンス改善が受けられなくなっていました。PR の作者は、特定バージョンへの固定を撤廃し、汎用的なバージョン指定ファイルに置き換えることを目的としていましたが、同時に実際に利用可能な新しい LTS 系へのバンプを検討しました。
Buildkite の CI リソースは有限であり、不要なビルドや古いツールチェーンによる失敗を回避したいという運用上の課題もありました。Node.js のバージョンを更新することで、CI 環境の整合性を保ちつつ、将来のマイナーバージョンアップへのハードルを下げられます。
このセクションでは、上記背景が本 PR の変更に至った経緯を示します。
技術的な変更
Dockerfile の Node.js ソース定義 を 18 系から 22 系へ切り替え、かつ apt の優先度設定を追加しました。ソースリストを書き換える行は deb ... node_22.x に変更し、/etc/apt/preferences.d/nodejs に高優先度 (Pin-Priority: 1001) を設定することで、意図しないダウングレードを防止します。
@@ -30,7 +30,8 @@ RUN set -ex && echo "--- :ruby: Updating RubyGems and Bundler" \
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
- && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_18.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
+ && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_22.x nodistro main" > /etc/apt/sources.list.d/nodesource.list \
+ && printf '%s\n' 'Package: nodejs' 'Pin: origin deb.nodesource.com' 'Pin-Priority: 1001' > /etc/apt/preferences.d/nodejs \
さらに、apt-get install 行から 固定バージョン指定 nodejs=18.19.0-1nodesource1 を除外し、単に nodejs と記述することで、APT が利用可能な最新の 22 系パッケージを取得できるようにしました。
@@ -93,7 +94,7 @@ RUN set -ex && echo "--- :ruby: Updating RubyGems and Bundler" \
&& apt-get install -y --no-install-recommends \
postgresql-client default-mysql-client sqlite3 \
- git nodejs=18.19.0-1nodesource1 lsof \
+ git nodejs lsof \
ffmpeg mupdf mupdf-tools poppler-utils \
pipelines/buildkite-config/initial.yml では、Rails 7 の安定ブランチラベルとビルドブランチ名を 7-0-stable から 7-2-stable へ置換しています。これに伴い、トリガーラベル、ビルドメッセージ、ブランチ指定の全箇所が更新され、CI パイプラインが新しいブランチを対象に走るようになります。
@@ -112,11 +112,11 @@ steps:
- trigger: "rails-ci"
- label: ":pipeline: Build Rails 7-0-stable with new config"
+ label: ":pipeline: Build Rails 7-2-stable with new config"
depends_on: block-rails-ci-stable
build:
- message: "[${BUILDKITE_BRANCH} / 7-0-stable] ${BUILDKITE_MESSAGE}"
- branch: "7-0-stable"
+ message: "[${BUILDKITE_BRANCH} / 7-2-stable] ${BUILDKITE_MESSAGE}"
+ branch: "7-2-stable"
@@ -144,11 +144,11 @@ steps:
- trigger: "rails-ci-nightly"
- label: ":pipeline: Build Rails 7-0-stable with new nightly config"
+ label: ":pipeline: Build Rails 7-2-stable with new nightly config"
depends_on: block-rails-ci-nightly-stable
build:
- message: "[${BUILDKITE_BRANCH} / 7-0-stable] ${BUILDKITE_MESSAGE}"
- branch: "7-0-stable"
+ message: "[${BUILDKITE_BRANCH} / 7-2-stable] ${BUILDKITE_MESSAGE}"
+ branch: "7-2-stable"
これらの変更はコードロジックを含まず、ビルド環境と CI 設定の調整に留まります。そのため、アプリケーションの動作には直接影響せず、ビルド時に使用されるツールチェーンが新バージョンに置き換わります。
設計判断
バージョンピンの除去 と apt preferences による強制的な優先度付与 の組み合わせは、将来的なマイナーバージョンアップを容易にする設計です。固定バージョンを残すと、アップデート時に Docker イメージの再ビルドが必要になるだけでなく、古いパッケージが残り続けるリスクが生じます。一方で、優先度を 1001 に設定すれば、意図しないダウングレードを防ぎつつ、最新の 22 系が常に取得されます。
Node.js 22 は すでに EOL ではありますが、18 系より新しい機能とセキュリティパッチが提供されている点で、段階的なアップグレードとして保守的に選択されました。完全な LTS 移行はまだ先になるものの、CI 環境だけ先んじて最新版を試すことで、将来の本番環境への影響を事前に評価できます。
この設計は「最小限の変更で最新化を図る」ことを優先し、既存のビルドパイプラインの安定性を保ちつつ、依存ツールの陳腐化を防ぐという判断基準に沿っています。
まとめ
Node.js を 22 系へバンプし、バージョン固定を外すことで CI 環境の保守性を向上させました。同時に Buildkite のブランチラベルを更新し、パイプラインが新ブランチを対象に走るよう整合性を確保しています。これにより、将来的なバージョンアップへの準備が整い、CI の安定稼働が継続できます。