はじめに
アプリケーションサービス部の宮本です。最近電動シュレッダーを買いました。暇さえあれば不要な書類をバリバリ粉砕して楽しんでいます。いつか大事な書類をバリバリしてしまわないか心配です。
さて、今回は Codebuild のマネージド型イメージで使用する Node.js のバージョンを厳密に指定する方法をご紹介します。
何がしたいのか
Codebuild では、ビルド環境として自前で用意した Docker イメージを使えますが、AWS が提供してくれる Docker イメージも利用することができます。これをマネージド型イメージと呼びます。
マネージド型イメージには、予め各言語のランタイムが用意されており、buildspec.yml で指定するだけで任意のバージョンを使用することができます。
# buildspec.yml での指定方法 version: 0.2 phases: install: runtime-versions: nodejs: 12.x # 使用するバージョンを指定
バージョンの指定方法は Node.js の場合、以下の様な方法があります。
nodejs: 12
-> 特定のバージョン(メジャーバージョンの最新)nodejs: 12.x
-> 特定のメジャーバージョンと最新のマイナーバージョン(実質、nodejs: 12
のエイリアスになっています)nodejs: 12.10
のようにマイナーバージョンを指定することが出来ません。
nodejs: latest
-> (使用するイメージで利用可能な)最新バージョン
参考) バージョンの指定方法 docs.aws.amazon.com
基本的には使用するメジャーバージョンの最新バージョンを使っておけば、問題がおきることは無いと思いますが、やんごとなき理由(例えば最新バージョンに不具合がある、ローカル開発環境のバージョンを変えられない)がある場合、マイナーバージョン、パッチバージョンを指定したいこともあります。これがこの記事の趣旨です。
結論
n コマンドを使いましょう。
例として、マネージド型イメージの一つである aws/codebuild/amazonlinux2-x86_64-standard:3.0
には n というググラビリティの悪いツールがインストールされています。これは Node.js のバージョンマネージャーで、指定したバージョンのインストール及びセットアップをしてくれるツールです。
n コマンドを使うと以下の様に、パッチバージョンまで指定することが出来ます。
# buildspec.yml の例 version: 0.2 phases: install: commands: - n 12.13.1 # パッチバージョンまで指定 pre_build: commands: - node -v
実行してログを確認すると、指定したパッチバージョンのインストール、及びセットアップが行われていることが確認できました。
[Container] 2021/10/01 08:46:19 Entering phase INSTALL [Container] 2021/10/01 08:46:19 Running command n 12.13.1 installing : node-v12.13.1 mkdir : /usr/local/n/versions/node/12.13.1 fetch : https://nodejs.org/dist/v12.13.1/node-v12.13.1-linux-x64.tar.xz installed : v12.13.1 (with npm 6.12.1) [Container] 2021/10/01 08:46:25 Phase complete: INSTALL State: SUCCEEDED [Container] 2021/10/01 08:46:25 Phase context status code: Message: [Container] 2021/10/01 08:46:25 Entering phase PRE_BUILD [Container] 2021/10/01 08:46:25 Running command node -v v12.13.1
(おまけ) Dockerfile の確認
マネージド型イメージにどんなツールがインストールされているかは、再掲になりますが以下ページのリンクから確認できます。
リンク先の GitHub で Dockerfile が確認できます。因みに、n コマンドのインストールは ここ で行っています。
Node.js だけでなく、他の言語についてもバージョンマネージャーがインストールされているので確認してみてください。
それでは良い CodeBuild ライフを!