🐒
Node.js 12.19.0 だと CircleCI 上で Webpack のビルドができない
はじめに
担当しているプロダクトでは 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 のフォーラム:
フォーラムに書かれている方法では複雑な記述になってしまうため、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 されるなら今までどおり最新バージョンを使ったほうがよさそうだと助言を頂いたため、いずれマイナーバージョンを固定しない元の方法に戻しそうです。
Discussion