バージョン情報
- Rails 5.0.7.2
- node 10.15.3
- npm 6.4.1
- yarn 1.13.0
エラー内容
なにもしてないのにデプロイが壊れた!
railsアプリをherokuで動かしていたんだけど、ある日突然、デプロイが失敗するようになってしまった・・・。
エラーメッセージは次のようになっていた。
-----> Installing dependencies
Installing node modules (yarn.lock)
yarn install v1.13.0
[1/4] Resolving packages...
[2/4] Fetching packages...
info No lockfile found.
[1/4] Resolving packages...
warning blint > nomnom@1.8.1: Package no longer supported. Contact support@npmjs.com for more info.
warning rollup-watch@4.3.1: rollup-watch functionality is now included in Rollup itself
[2/4] Fetching packages...
error https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz: Extracting tar content of undefined failed, the file appears to be corrupt: "ENOENT: no such file or directory, stat '/tmp/yarncache.sVVDN/v4/npm-acorn-6.1.1-7d25ae05bb8ad1f9b699108e1094ecd7884adc1f/node_modules/acorn/CHANGELOG.md'"
うーん、これyarn installの時にエラーになってるんだよなあ・・。ENOENT: no such file or directory, stat '/tmp/yarncache
がエラーの内容だと思うけど、tmpファイルでのエラーって?私悪く無さそうだな。
コードの変更はrails周りしか行っていないので、なぜyarn周りでエラーが出てデプロイできないんだろ、と謎が深まる。
キャッシュクリア(解決しない)
軽く調べてみると、「キャッシュクリアするといいよ」って記事がうじゃうじゃ出てくる。
なので、次のherokuコマンドを実行してみた。
heroku repo:purge_cache -a myapp
解決しないぜ!
というか、そもそも、キャッシュのディレクトリでENOENT
が出てるんだから、キャッシュ消すとか意味ないよね!?
キャッシュを使わない(解決しない!)
次は、「キャッシュ自体を使わないようにすればいいのでは!」という気持ちになってきた。
なので、次のコマンドを実行してキャッシュを無効にした。
heroku config:set NODE_MODULES_CACHE=false -a myapp
その後、デプロイしてみたところ、解決しない・・。
解決しないぞ!
yarn時のnetwork-concurrencyを1にする(解決した!!)
もっと調べると、似たような事例が議論されているのを見つけた。
https://www.bountysource.com/issues/41665538-yarn-install-fails-with-enoent-no-such-file-or-directory-occasionally
これによると、yarn install --network-concurrency 1
であれば成功するらしい。
なので、.yarnrc
でその指定をするようにした。
--install.network-concurrency 1
解決した!
けど、いったいどこが悪さをしてこんなエラーを引き起こしたんだろ・・。
concurrencyを1にすればいいってことは、タイミングの問題ってこと?運ゲーじゃんか。