GitHub Actions の実行ランタイムで Node.js v20 を使うようにする

2023.11.20

こんにちは、CX 事業本部 Delivery 部の若槻です。

最近、AWS Lambda のランタイムで Node.js 20 がサポートされる熱いアップデートがありましたね。これを受けて、早速新規作成する Lambda を Node.js 20 で実装したり、既存の Lambda をアップデートする際の影響調査をされていたりする方も多いのではないでしょうか。

そして合わせてアップデートしておきたいのが CI/CD パイプラインの Node.js バージョンです。特に CI では依存関係のインストールや、TypeScript のトランスパイル、モジュールバンドリングなどの様々なビルド処理が行われるため、互換性のリスクを避けるためにもビルド環境である CI のランタイムと、実行環境である Lambda のランタイムは出来れば一致させておきたいところです。

そこで今回は、代表的な CI/CD ツールである GitHub Actions で Node.js v20 ランタイムを使うようにする方法を確認してみました。

GitHub Actions では既定では Node 18 が使われる

GitHub Actions の実行ランタイムで既定使われる Node.js バージョンを確認してみます。

次のような Node.js バージョンを出力するだけの GitHub Actions ワークフローを作成します。

.github/workflows/ci.yml

on: workflow_dispatch

jobs:
  test:
    runs-on: ubuntu-latest
    steps: 
      - run: node --version

ワークフローを実行すると、次のように既定では Node.js v18 が使われていることが分かります。

Run node --version
  node --version
  shell: /usr/bin/bash -e {0}
v18.18.2

GitHub Actions で Node 20 を使うようにする

GitHub Actions の実行ランタイムで使われる Node.js バージョンを変更するには、setup-node アクションを使います。

これは公式のドキュメントでも紹介されている方法となります。

ワークフローでは次のように actions/setup-nodenode-version 引数に 20 を指定します。

.github/workflows/ci.yml

on: workflow_dispatch

jobs:
  test:
    runs-on: ubuntu-latest
    steps: 
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: "20"
          cache: npm

      - run: node --version

ワークフローを実行すると、次のように Node.js v20 が使われるようになったことが分かります。

Run node --version
  node --version
  shell: /usr/bin/bash -e {0}
v20.9.0

ロックファイルが必要

setup-node アクションの実行では Node.js ランタイムで利用可能な依存関係のロックファイルが必要となります。ロックファイルがない場合は、次のようなエラーが発生します。

Error: Dependencies lock file is not found in /home/runner/work/cdk_sample_app/cdk_sample_app. Supported file patterns: package-lock.json,npm-shrinkwrap.json,yarn.lock

そのため先に checkout アクションなどで package-lock.json などを取得しておく必要があります。

バージョンの指定は semver で指定可能

setup-node アクションでの node-version 引数には Node.js のバージョンを semver で指定することができます。

よって、20.9.0 のようにパッチおよびマイナーバージョンまで指定したり、latest のようにメジャー含めた最新バージョンを常に指定させることも可能です。

来年春までに、Node 16 から 20 への移行が行われる

Node.js 16 のサポート終了を受けて、GitHub Actions では 2024 年春までに Node.js 16 から Node.js 20 への移行が計画されています。

2024 年春"まで"なので、明日にでも強制的な移行が行われる可能性はゼロではないため、現在 Node.js 16 が使われている環境では早急な対応が必要となります。現在 Node.js 16 が使われているワークフローの実行では警告が出力されるようになっているため、ユーザーがワークフロー内で明示的に指定している場合はもとより、依存しているアクションの中で使われていないか念のため確認しておくと良いでしょう。

おわりに

GitHub Actions の実行ランタイムで Node.js v20 を使うようにする方法を確認してみました。

AWS Lambda のランタイムを Node.js v20 にアップデートするのを機に、GitHub Actions の実行ランタイムも Node.js v20 にアップデートしておくと良いでしょう。

以上