Please use `bundle exec' to running rails application

Developer
Aug 3, 2012 at 3:25 AM

Hi,

It seems that currently NougakuDoCompanion invoke rails application with command as follows.

> ruby.exe -C C:\NougakuDoCompanion\Runtime\Working\NougakuDo\bin\ruby.exe -C\NougakuDoCompanion\Runtime\Working\NougakuDo\bin rackup -p 80 -E production -s Ennou C:\NougakuDoCompanion\Application\Working\myApplication\configEnnou.ru


I have encountered some difficulty about deploy a rails applications with NougakuDo and NougakuDoCompanion to Windows Azure web role instance. When I upload NougakuDo.zip larger than 60MB, unzip NougakuDo.zip encounter the error "there's not enough disk space". Maybe there's runtime deploy size limitation.

I try to shrink the NougakuDo.zip by bundle gem packages to application.zip with Bundler.

bundel install --path vendor/bundle

But it doesn't work with NougakuDoCompanion.

Running rails applications with bundler is present de facto standard. Why don't you use `bundle exec' to start applications.


日本語でも読んで頂けると思いますので日本語でも記述します。

http://msdn.microsoft.com/ja-jp/windowsazure/hh531535

こちらのホワイトペーパーを参考にして、NougakuDoCompanion+NougakuDo 1.3.2 で簡単な Rails アプリケーションを Azure の cloud service (Paas) の web role にデプロイする検証を行っておりましたが、rails アプリ起動に bundle exec を利用して頂けないでしょうか。

理由は以下の通りです。

  1. Rails アプリケーションの起動において bundler の利用はデファクトスタンダードになっている
  2. 利用するgemパッケージをNougakuDoにインストールしてNougakuDo.zipのサイズが大きくなると、ディスク容量不足のエラーが発生するようです。境界値ははっきりしませんがzipファイルが45MB程度であれば展開はでき、60MBを越えるとエラーになるようです。リモートデスクトップでインスタンスに接続したところ C: ドライブのディスク容量は余裕があるので何かしらフォルダ毎の容量制限がかかっているのではないかと推測しています。
    これを回避するために、bundle install を用いて必要な gem パッケージを application 側に同梱するようにしたところ、unzip は成功するのですが、現在の起動コマンドが rackup を直接実行するものなので gem パッケージを読み込めずにエラーになります。(ERROR Launcher:Ruby start error. というログが残ります)

リモートデスクトップで接続して、以下のように BUNDLE_GEMFILE環境変数を設定して bundle.bar exec をつけて実行することで起動できることを確認しております。

環境変数をセット
> set BUNDLE_GEMFILE=C:\NogakuDoCompanion\Application\Working\myApplication\Gemfile
> cd C:\NogakuDoCompanion\Runtime\Working\NougakuDo\bin
> bundle.bat exec rackup.bat -p 80 -E production -s Ennou C:\NougakuDoCompanion\Application\Working\myApplication\configEnnou.ru

以上、よろしくお願い致します。

Developer
Aug 9, 2012 at 11:52 AM

I'm going to paste my tiny patch.

Please check it out!



たとえば以下のようなパッチを NougakuDoController/Helpers/Nougakudo.cs にあてると
期待した効果が得られます。
Windows 上での開発に不慣れなものですので参考までに。

以上、よろしくお願い致します。

diff --git a/NougakuDoController/Helpers/Nougakudo.cs b/NougakuDoController/Helpers/Nougakudo.cs
index 9d07c6f..3cc1d7d 100644
--- a/NougakuDoController/Helpers/Nougakudo.cs
+++ b/NougakuDoController/Helpers/Nougakudo.cs
@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.IO;
+using System.Runtime.InteropServices;
 
 using Commons = NougakudoCompanion.Commons;
 
@@ -313,11 +314,14 @@ namespace NougakuDoController
                 return false;
             }
         }
-
+        [DllImport("Kernel32.dll")]
+        static extern bool SetEnvironmentVariable(string name, string val);
         string GenerateCommandArgs()
         {
+            SetEnvironmentVariable("BUNDLE_GEMFILE", Path.Combine(configPath, "Gemfile"));
             string args = "-C" + rubyPath + " " +                       // Path of command
-                          Path.Combine(rubyPath, "rackup") + " ";       // Rack scropt
+                          Path.Combine(rubyPath, "bundle") + " exec ";  // Bundle script
+            args += Path.Combine(rubyPath, "rackup.bat") + " ";         // Rack script
             if (debugging)
                 args += "-d ";                                          // debbuging flags
             if (warnings)

Coordinator
Aug 19, 2012 at 1:09 PM

Yes, I will check the temporary space for unzip. I think that is a limitation of Azure temporary size. I check your patch.

多分ですが、Azure側のテンポラリーサイズに制限がかかっているかも知れません(Runtime環境を展開するローカルリソースは、200Mを設定してあります)。こちらの件も調べてみます。bandle execに関しては、検討してみます。

 

Coordinator
Aug 26, 2012 at 7:03 AM
Edited Aug 26, 2012 at 7:25 AM

Issue1: Not extract the large zip file.
  The local resource's capacity is small. So resize local resource, then add temp local resource. Now setting is follow.
  Runtime 4G、Application 4 G、Download 4G、Temp 2G

Issue2: Not use "bundle" command.
  Yes. I changed commandline args from rackup to bundle.

Resolve released NougakuDoCompanion v1.1.0.

問題1:大きなzipファイルを展開できない
WebRoleのローカルリソースのサイズが不足していたことが原因です。この問題に対処するために、Temp用のローカルリソースを追加して、サイズを見直しました。見直したサイズは、xsインスタンスで動作するように、Runtime 4G、Application 4 G、Download 4G、Temp 2Gです。利用するインスタンスサイズに応じて、設定を変更してください。私の方で、105MのZIP(展開すると186M)で動作確認しています。

問題2:railsの起動コマンドに bundleを使用していない
ご提示いただいたパッチをベースに検証を行った結果、-C[Ruby fullpath]\bin bundle exec rackup -p 80 -E production -s Ennou [config.ru fullpath]\configEnnou.ru に変更しました。exec に引き渡す rackup をフルパスにすると動作しなかったことから、rackup のみにしています。

これで動作確認をしていただけますでしょうか。

 

Developer
Aug 27, 2012 at 3:10 AM
Edited Aug 27, 2012 at 3:11 AM

Thank you for your kindly support!

I can confirm v1.1.0 fix a first issue (about temporary disk size limit).

But unfortunately, new command line with bundle exec seems end up with the following error message.

Could not locate Gemfile

I think setting BUNDLE_GEMFILE at the last of command line doesn't work well.

Best regards,

 


 

対応と v1.1.0 のリリースありがとうございました。

v1.1.0 のパッケージを利用して動作確認致しました。

zip ファイル展開のサイズ制限の緩和は確認できました。

しかし bundle exec を利用するようにしたコマンドラインは起動に失敗しているようで、リモートデスクトップでログインして C:\NougakuDoCompanion\Runtime\Work\<application>.log に出力されているコマンドをコマンドプロンプトから打ってみたところ以下のエラーメッセージで終了しました。

Could not locate Gemfile

BUNDLE_GEMFILE の設定がコマンドラインの最後に追加されているようですが、これが有効に働いていないようです。
bash など Unix系の shell では

$ BUNDLE_GEMFILE=<...> ruby ...

のようにコマンドの前に環境変数の設定を記述できますが、Windows コマンドで同様のことをする方法がわかりませんでした。前出したパッチではそういうわけで NougakuDoController 内で環境変数を設定していました。

以上、よろしくお願い致します。

Coordinator
Aug 30, 2012 at 10:35 AM

Thank you for your reply.
Hum, "Could not locate gemefile".... What ?  Please try follow commands.
1.connect remote desktop.
2.open command prompt.
3.change current directory to "C:\NougakuDoComapnion\Runtime\Working".
4.type "NougakudoLauncher <application.txt>".
5.Tell me NougakudoLauncher.txt as log file.

試して頂いて、有難うございます。それでしたら、一度、以下を試して頂けませんでしょうか。
1.リモートデスクトップで接続します
2.コマンドプロンプトを開きます
3.カレントを、"C:\NougakuDoComapnion\Runtime\Working"に移動します
4."NougakudoLauncher <application.txt>" コマンドを入力します
5.NougakudoLauncher.txtの内容を教えて下さい(このファイルが、ログファイルになります)
<application>.txtには、ruby.exe、コマンドライン引数、環境変数の順にデータを登録しています。
NougakudoLauncher.exeが、ruby.exeを起動する時にBUNDLE_GEMFILEを設定しています。この設定が悪いのであれば、NougakudoLauncherのStartup.csの29行目を書き換える必要があるかも知れません。また、VMは、Windows Server 2008R2(初期設定)のままでお使いですよね。
#私が試した限りは、動作しているんですが、bundleコマンドを使用するようなアプリを使っていない点が検証不足だと考えています。

もし宜しければ、試して頂いた結果をメール(shozoa atmark microsoft dot com)へ送って頂けませんでしょうか。
ご検討を宜しくお願いします。

Coordinator
Sep 3, 2012 at 2:58 AM

groovenauts , Thank you for your feedback.
This problem is a case of ennnou mul process. When run ennou mul process, rack in application directory used. so happen "not find ruby.exe". I will check "bundle exec rackup" command.

試して頂いて有難うございます。ennouをマルチプロセスで起動する場合に、ruby.exeのパスがアプリケーション ディレクトリになってしまっていることが原因という報告をいただいて、助かります。私の方でも、bundle exec rackup コマンドを色々と調査してみます。自分の実験環境では、batファイルにすると動作しなかったので、rackupにしたのですが、これが悪影響を与えていることがわかっただけでも助かりました。