【ruby】RailsをProductionモードで起動するのが大変だった件
ここ数日Railsの勉強と称して(勝手に)自社で使っている内製のバグトラッキングツールをRailsで作り直していました。
将来的には社内で使ってもらうことを目論んでいるのですが、現状では社内ネットワーク上にデプロイするしかなく、そのためAWSやHerokuのようなクラウドにはデプロイすることができません。
今までも何度かRailsのアプリは作ったことがあったのですが、よくよく考えると自分で周辺環境を整えてそこにデプロイするって経験が無かったので、良い機会だと思いやってみたところ、見事にハマりましたよ。
今回はその辺をまとめてみようかと思います。
まずはProductionモードでアプリケーションを起動してみます。
rake db:migrate RAILS_ENV=production
したら大量のエラーが。
PS C:workrubyslms> rake db:migrate RAILS_ENV=production
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
rake aborted!
uninitialized constant V8::JSError
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less/java_script/v8_context.rb:61:in `rescue in lock'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less/java_script/v8_context.rb:60:in `lock'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less/java_script/v8_context.rb:19:in `initialize'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less/java_script/v8_context.rb:15:in `new'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less/java_script/v8_context.rb:15:in `instance'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less/loader.rb:12:in `initialize'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less.rb:14:in `new'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less.rb:14:in `<module:Less>'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/less-2.3.2/lib/less.rb:9:in `<top (required)>'
C:/work/ruby/slms/config/application.rb:7:in `<top (required)>'
C:/work/ruby/slms/Rakefile:5:in `<top (required)>'
(See full trace by running task with --trace)
V8::JSErrorてことはGem関連できっと何か読み込めてないんだなぁと。
ログに書いてある行について調べてみると、
Productionモードのときの設定についてはここにドンピシャなことが書いてありました。
# application.rb
# Enable the asset pipeline
config.assets.enabled = true
# アセットパイプラインが有効となっている。
#production.rb
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# ライブコンパイルが無効になっている。
この設定だと、プリコンパイル済みのアセットを探しにいって見つからなければエラーとなるのだそう。
プリコンパイルはまだしていないので、public直下にassetsはありません。それが原因かな。
じゃあライブコンパイルの設定をTrueに変えるか、プリコンパイルすれば良いはず。
プリコンパイルしてみる。
PS C:workrubyslms> bundle exec rake assets:precompile RAILS_ENV=production
が、なんだか大量のエラーが。
(結局後でこれと対峙することになるのですが)もう1つの手段、ライブコンパイルを有効にして試してみます。
production.rb
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = true
結局同じエラー出たーーーー
よくよく考えれば、プリコンパイルに失敗しているので、この設定変えても結果は当然一緒でしたね。
試行錯誤しつつ、application.jsのGemの読み込み方法を変更。自動プリコンパイル設定にしてmigrate。
application.rb のGemfile読み込みについてはここを参考に
とても詳しく記載されていて勉強になりました。
Bundler.require(:default, :assets, Rails.env)
# production環境でも:assetsをロードするので、自動でプリコンパイルしてくれる
migrateが成功しました。
がしかし!!
サーバーを起動しようとしたところ、先ほどと同じエラーが・・・orz
PS C:workrubyslms> bundle exec rake assets:precompile RAILS_ENV=production
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
C:/Ruby192/bin/ruby.exe C:/work/ruby/slms/vendor/ruby/1.9.1/bin/rake assets:precompile:all RAILS_ENV=production RAI
LS_GROUPS=assets
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
rake aborted!
Unexpected token: operator (<) (line: 27631, col: 0, pos: 808814)
Error
at new JS_Parse_Error (<eval>:2065:10542)
at js_error (<eval>:2065:10761)
at croak (<eval>:2065:18454)
at token_error (<eval>:2065:18591)
at unexpected (<eval>:2065:18679)
at expr_atom (<eval>:2065:26625)
at maybe_unary (<eval>:2065:29049)
at expr_ops (<eval>:2065:29807)
at maybe_conditional (<eval>:2065:29899)
at maybe_assign (<eval>:2065:30342)
(in C:/work/ruby/slms/app/assets/javascripts/application.js)C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-
1.4.0/lib/execjs/ruby_racer_runtime.rb:34:in `rescue in block in eval'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/ruby_racer_runtime.rb:28:in `block in eval'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/ruby_racer_runtime.rb:80:in `block in lock'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/ruby_racer_runtime.rb:78:in `call'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/ruby_racer_runtime.rb:78:in `Locker'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/ruby_racer_runtime.rb:78:in `lock'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/ruby_racer_runtime.rb:27:in `eval'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/execjs-1.4.0/lib/execjs/ruby_racer_runtime.rb:19:in `exec'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/uglifier-2.1.0/lib/uglifier.rb:173:in `really_compile'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/uglifier-2.1.0/lib/uglifier.rb:97:in `compile'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/actionpack-3.2.11/lib/sprockets/compressors.rb:74:in `compress'
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/sprockets-2.2.2/lib/sprockets/processing.rb:265:in `block in js_compressor
='
C:/work/ruby/slms/vendor/ruby/1.9.1/gems/sprockets-2.2.2/lib/sprockets/processor.rb:29:in `call'
assetsのapplication.js が問題になってるのかな?
たしかにちょっとコード書いてあるけど。
とりあえず、このapplication.js を消して再度プリコンパイルしてみたところ、プリコンパイルに成功!
PS C:Yutoworkrubyslms> bundle exec rake assets:precompile RAILS_ENV=production --trace
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
** Invoke assets:precompile (first_time)
** Execute assets:precompile
C:/Ruby192/bin/ruby.exe C:/work/ruby/slms/vendor/ruby/1.9.1/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets --trace
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
** Invoke assets:precompile:all (first_time)
** Execute assets:precompile:all
** Invoke assets:precompile:primary (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:primary
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
fatal: Not a git repository (or any of the parent directories): .git
** Invoke assets:precompile:nondigest (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
** Invoke tmp:cache:clear (first_time)
** Execute tmp:cache:clear
** Execute assets:precompile:nondigest
よかったよかった。
これで rails s -e production でProductionモードで起動できました。
けど、よくよく考えてみると、なんでプリコンパイルが失敗する状況だったのにapplication.rbの設定変更でmigrationが通ったのか不明です。
釈然としませんが今日はここで。