久しぶりに Wercker で新しいRailsアプリのビルドを実行してみたら、ビルドが途中でこける問題が発生

こんなエラーがでて死んでた

/cache/bundle-install/ruby/2.2.0/gems/execjs-2.5.2/lib/execjs/runtimes.rb:48:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

このエラーを見ると、execjs, Could not find a JavaScript runtime という 以前ハマった v8 周り、つまり therubyracery いれるだのいれないだのの問題を思い出した。

ここで execjs, therubyracery を Gemfile に入れると動くのかもしれないけれど(試してないけど)、 ローカルや、他のアプリがこれなしで本番環境で問題無く動くのに、Werckerのために入れてしまうのは本末転倒な気がするので、 別の解決方法を模索する。

以前も別の記事で書いた気がするけど、このエラーってexecjs がJavaScriptランタイムを見つけられなくて発生するので、 そもそもOS上にJSの実行環境がないんでしょう。つまり Linux だから Node.js 辺りが入っていればいいものが、入っていないはず。

どうもいろいろ見ていると、いろんなサイトで書かれている box: rvm というのはもともと Wercker 自体がホストしてたイメージっぽいね。

https://app.wercker.com/#applications/52c6d6e1728cc898720001e3/tab/details

で、今は Wercker ではなく、dockerhub からイメージを取得してくるように変わったらしい。

それで今回、Wercker が初期に自動生成してくれた wercker.yml には box: ruby と書かれていたのか。

元々のアプリがJavaScript周りでこけなかったのは、

先ほどの rvm イメージのページの下の方に載っているけど、このイメージが nodejs なんかも含めているからで、

dockerhubruby イメージは、純粋に Ruby のイメージとなっている。

そりゃ Runtime が見つからないわけだ。

といことで、

  • ruby 2.2.2
  • node.js

を含むイメージを探してみる。

ruby がちょっと新しすぎるみたいで、2.2.1 までのやつが多かった。

で、mwallasch/docker-ruby-node なら要件にマッチしそう。

README的なところには 2.2.1 って書かれてるけど、dockerfile を見ると 2.2.2 と書かれているし、

実際に Wercker の step で echo させてみると、 2.2.2-p95 が返ってきた。

そして、無事 execjs 部分も通過、ビルドも通ったとさ。