gae上でjrubyを動かしたい。までの道のり3
何がしたいの?
- Google App Engine上でrubyアプリケーションを公開したい
どのように機能するの?
何を使うの?
gem「google-appengine」
どこで確認したの?
- MacOSX (10.6.2 Snow Leopard) (Darwin Kernel Version 10.2.0)
- java 1.6.0_17
- ruby 1.8.7 (2008-08-11 patchlevel 72)
- google-appengine (0.0.10.1)
いつ確認したの?
- 2010年3月27日
何か注意点はあるの?
- 特にありません
どんな手順でやるの?
まずは環境確認です。
今回からはCrubyの実行環境はruby1.8です。
$ $ ruby -v ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0] $ $ gem list google-appengine *** LOCAL GEMS *** google-appengine (0.0.10.1) $
ディレクトリ/opt/app/devにアプリケーションnnz-testを作成します....作成できました。
$ cd /opt/app/dev $ $ ls $ $ appcfg.rb generate_app nnz-test => Generating gemfile => Bundling gems Calculating dependencies... Updating source: http://gems.rubyforge.org /Library/Ruby/Gems/1.8/gems/bundler08-0.8.5/lib/bundler08/resolver.rb:115:Warning: Gem::Dependency#version_requirements is deprecated and will be removed on or after August 2010. Use #requirement Caching: appengine-rack-0.0.6.gem Caching: rack-1.1.0.gem Installing rack (1.1.0) Installing appengine-rack (0.0.6) Done. => Packaging gems => Installing JRuby => Installing JRuby-Rack => Installing appengine-sdk => Generating rackup => Generating configuration files $ $ ls nnz-test $
ローカルで起動します...起動しました。
$ cd nnz-test/ $ pwd /opt/app/dev/nnz-test $ dev_appserver.rb . => Booting DevAppServer => Press Ctrl-C to shutdown server 中略 The server is running at http://localhost:8080/ $
GAEにアップロードします....アップロードが完了しました。
$ pwd /opt/app/dev/nnz-test $ $ cat config.ru require 'appengine-rack' AppEngine::Rack.configure_app( :application => "nnz-test", :precompilation_enabled => true, :version => "1") run lambda { Rack::Response.new("Hello").finish } $ $ appcfg.rb update . => Running AppCfg Reading application configuration data... Beginning server interaction for nnz-test... 0% Creating staging directory 5% Scanning for jsp files. 20% Scanning files on local disk. 25% Initiating update. Email: メールアドレスを入力する Password for メールアドレス に対応するパスワードを入力する 28% Cloning 2 static files. 31% Cloning 11 application files. 40% Uploading 3 files. 52% Uploaded 1 files. 61% Uploaded 2 files. 68% Uploaded 3 files. 73% Initializing precompilation... 90% Deploying new version. 95% Will check again in 1 seconds 98% Will check again in 2 seconds 99% Will check again in 4 seconds 99% Will check again in 8 seconds 99% Will check again in 16 seconds 99% Closing update: new version is ready to start serving. 99% Uploading index definitions. Update completed successfully. Success. Cleaning up temporary files... $
ダッシュボードを確認します。.... version 1 のアプリケーションが稼働していることが確認できました。
ブラウザでappspot.comにアクセスします。.....appspot.com上でレスポンスを確認できました。
次はsinatraアプリです。
myapp.rbを作成し、myapp.rbを呼び出すように変更して、開発サーバで実行してみます....豪快にコケました。
requireがオカシイと言ってます。
$ $ cat myapp.rb require 'rubygems' require 'sinatra' get '/' do 'top page' end get '/ja' do 'ようこそ!!' end get '/en' do 'welcame!!' end get '/ja/info' do '<h2>これはなに?</h2>' end get '/en/info' do '<h2>what is this?</h2>' end $ $ cat config.ru require 'appengine-rack' require 'myapp' AppEngine::Rack.configure_app( :application => "nnz-test", :precompilation_enabled => true, :version => "2") run Sinatra::Application $ $ $ dev_appserver.rb . => Booting DevAppServer => Press Ctrl-C to shutdown server 2010-03-28 01:02:04.981 java[94720:1607] [Java CocoaComponent compatibility mode]: Enabled 2010-03-28 01:02:04.983 java[94720:1607] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000 2010/03/27 16:02:05 com.google.appengine.tools.development.agent.impl.BlackList initBlackList ?v???I: Unable to read a jre library while constructing the blacklist. Security restrictions may not be entirely emulated. /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/plugin.jar 2010/03/27 16:02:10 com.google.appengine.tools.development.ApiProxyLocalImpl log ?v???I: [1269705730220000] javax.servlet.ServletContext log: unable to create shared application instance org.jruby.rack.RackInitializationException: no such file to load -- sinatra from ./myapp.rb:2 from ./myapp.rb:3:in `require' from config.ru:3 at org.jruby.rack.DefaultRackApplicationFactory$4.init(DefaultRackApplicationFactory.java:169) at org.jruby.rack.DefaultRackApplicationFactory.getApplication(DefaultRackApplicationFactory.java:51) at org.jruby.rack.SharedRackApplicationFactory.init(SharedRackApplicationFactory.java:27) at org.jruby.rack.RackServletContextListener.contextInitialized(RackServletContextListener.java:40) at org.mortbay.jetty.handler.ContextHandler.startContext(ContextHandler.java:530) at org.mortbay.jetty.servlet.Context.startContext(Context.java:135) at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1218) 以下、省略
Gemfileに gem "sinatra" を付け加えて再実行します...今度はうまく行きました。
アプリケーション本体でrequireするgemはGemfileにも書かなければならないようです。
$ cat Gemfile # Critical default settings: disable_system_gems disable_rubygems bundle_path ".gems/bundler_gems" # List gems to bundle here: gem "appengine-rack" gem "sinatra" $ $ dev_appserver.rb . => Booting DevAppServer => Press Ctrl-C to shutdown server => Bundling gems Calculating dependencies... Updating source: http://gems.rubyforge.org /Library/Ruby/Gems/1.8/gems/bundler08-0.8.5/lib/bundler08/resolver.rb:115:Warning: Gem::Dependency#version_requirements is deprecated and will be removed on or after August 2010. Use #requirement Installing sinatra (1.0) Done. => Packaging gems 2010-03-28 01:07:06.227 java[94733:1607] [Java CocoaComponent compatibility mode]: Enabled 2010-03-28 01:07:06.230 java[94733:1607] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000 2010/03/27 16:07:06 com.google.appengine.tools.development.agent.impl.BlackList initBlackList ?v???I: Unable to read a jre library while constructing the blacklist. Security restrictions may not be entirely emulated. /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/lib/plugin.jar The server is running at http://localhost:8080/
エンコードの指定をしていないので、手動で文字コードを変更する必要があるかもしれませんが、そこはご愛嬌。
開発サーバで想定通りの表示を得ることができました。
アップロードします...成功しました。
$ $ appcfg.rb update . => Running AppCfg Reading application configuration data... Beginning server interaction for nnz-test... 0% Creating staging directory 5% Scanning for jsp files. 20% Scanning files on local disk. 25% Initiating update. 28% Cloning 2 static files. 31% Cloning 12 application files. 40% Uploading 4 files. 52% Uploaded 1 files. 61% Uploaded 2 files. 68% Uploaded 3 files. 73% Uploaded 4 files. 77% Initializing precompilation... 90% Deploying new version. 95% Will check again in 1 seconds 98% Will check again in 2 seconds 99% Will check again in 4 seconds 99% Will check again in 8 seconds 99% Will check again in 16 seconds 99% Closing update: new version is ready to start serving. 99% Uploading index definitions. Update completed successfully. Success. Cleaning up temporary files... $
バージョン2をアップロードしましたが、
google app engine -[Administration]-[Versions]で見てみるとアップロードしただけは、defaultバージョンは更新されず[1]のままです。
[2]→[Make Default]を選択することで新しいバージョンがデフォルトになります。
sinatraアプリケーションの動作確認が完了しました。
テストサイトは適宜バージョン更新します。この時のバージョンはこれです。
アプリケーションは上書きされるわではなく世代保存されています。
バージョンを明示的に指定して以前のバージョンのアプリケーションに接続することができます。
http://1.latest.nnz-test.appspot.com/
http://2.latest.nnz-test.appspot.com/