herokuでyarn+railsのデプロイがyarn時に失敗した

バージョン情報

  • 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にすればいいってことは、タイミングの問題ってこと?運ゲーじゃんか。

タイトルとURLをコピーしました