Node.js 12.19.0 だと CircleCI 上で Webpack のビルドができない

公開:2020/10/11
更新:2020/10/17
2 min読了の目安(約1800字TECH技術記事

はじめに

担当しているプロダクトでは CircleCI 経由で ECS へデプロイしているのですが、今回「あれ、本番反映されてないぞ?」というところで調査が始まりました。

エラーログ

ログを確認したところ、Webpack のビルドがこけていたためアプリの Docker イメージが ECR に push されていなかったためでした。

CircleCI
Step 9/9 : RUN npm run ****uction
 ---> Running in a49599abd805

> @ ****uction /myapp
> cross-env NODE_ENV=****uction node_modules/webpack/bin/webpack.js --no-progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js

 DONE  Compiled successfully in 567136ms4:28:54 AM

internal/fs/utils.js:269
    throw err;
    ^

Error: EPERM: operation not permitted, copyfile '/myapp/node_modules/lazysizes/lazysizes.min.js' -> '/myapp/public/js/lazysizes/lazysizes.min.js'

原因

10/6 にリリースされた Node.js のバージョン 12.19.0 が原因だったようです。

Dockerfile
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - \
  && apt-get install -y nodejs \

このようにプロダクトでは特にマイナーバージョンを固定せず12系を使っていましたが、一つ前の 12.18.4 で固定することで解決しました。

We also had the same issue this morning since the https://deb.nodesource.com/setup_12.x 7 script started installing 12.19.0

We resolved the issue by forcing installation of nodejs 12.18.4

CircleCI のフォーラム:
https://discuss.circleci.com/t/docker-build-fails-with-nonsensical-eperm-operation-not-permitted-copyfile/37364/20?u=kotahashihama

フォーラムに書かれている方法では複雑な記述になってしまうため、n パッケージを使ってバージョンを固定することにしました。

Dockerfile
ENV NODE_VERSION 12.18.4

RUN apt-get install -y nodejs npm \
  && npm install -g n \
  && n $NODE_VERSION

nodejs, npm, nパッケージ構築備忘録【Ubuntu18.04 LTS】 - Qiita

ちなみに、CircleCI 上でなくローカルでビルドすると問題ないようです。

おわりに

バージョンの固定って大事だなと思いました。

一方で

  • Node.js のバージョンは頻繁に更新される
  • 12系ならいきなり壊れるケースはめったにない

ので、Node.js 12.9.1 等で fix されるなら今までどおり最新バージョンを使ったほうがよさそうだと助言を頂いたため、いずれマイナーバージョンを固定しない元の方法に戻しそうです。