Travis CIでのnpm installが失敗する

Travis CIでnpm installを繰り返していると稀に失敗する現象に遭遇しました。ローカル側でも再現されるかは不明で、また原因の切り分けもできていません。取り急ぎの対策を含めブログに記録しておきます。

事象

matrixを設定し、複数のbuild jobsを立ち上げてnpm installを繰り返していると、例えば下記のように、稀に失敗するjobがでてきます。

npm ERR! cb() never called!を出してビルドが止まっています。タイムアウトしているのか、ネットワークエラーなのか、原因はよくわかりません。

https://travis-ci.org/KamataRyo/inherit-theme-mods/jobs/129318842#L212

テストが成功する見込みであるにもかかわらず、この後に設定しているデプロイのプロセスが発火しないため、大変困ります。

同様の現象はnpmにもissueされています。
https://github.com/npm/npm/issues/2907

対策

npm cache cleannpm installに行うなどを試しましたが、解決しませんでした。
この現象は散発的に発生するので、とりあえずのパッチとして、成功するまでnpm installを繰り返すよう設定を変更しました。Travis CIの設定ファイル(.travis.yml)において、travis_retryの文字列をnpm installの前に追加します。

.travis.yml (raw)

before_script:
  - travis_retry npm install

travis_retryはtravis CI側の制御構文で、3回を上限にコマンドが成功するまで実行を繰り返してくれるようです。

https://docs.travis-ci.com/user/common-build-problems/

とりあえずはこれで大丈夫そうなので、原因を調べつつ、しばらく様子を見ることにします。

なお、language: node_jsを指定している場合はnpm installが自動的に実行されるため、この対策は無効だと思われます。