Pages

2010/09/26

GAEでjruby、windowsからデプロイ・後編

前回はgoogle-appengine のgemを入れたとこまでやったので、その後。
 
 

続きと言いつつ、windowsでやるなら最初からjrubyでやったほうが楽ぽいのでローカルからjruby、こんな環境で。


C:\ruby\jruby-1.5.2\bin\jruby --version
jruby 1.5.2 (ruby 1.8.7 patchlevel 249) (2010-08-20 1c5e29d) (Java HotSpot(TM) Client VM 1.6.0_21) [x86-java]

 
 



フレームワークの自動生成


さてrubyで何かいたらええねんと思ったら、ちゃんとフレームワークが用意されてるので、ガイドに沿って進める。

ガイドはこちらに。

GettingStarted - appengine-jruby


 

作業用のディレクトリに移動し、appcfg.rbを使って"hello"という名前のアプリケーションを生成。
パスを通してなかったらアプリ名以外全部フルパスでやりましょう。

C:\ruby\works>jruby appcfg.rb generate_app hello

=> Generating gemfile
C:/ruby/jruby-1.5.2/lib/ruby/gems/1.8/gems/appengine-tools-0.0.16/lib/appengine-
tools/gem_bundler.rb:63 warning: already initialized constant RUBY_ENGINE
=> Bundling gems
Calculating dependencies...
Updating source: http://gems.rubyforge.org
C:/ruby/jruby-1.5.2/lib/ruby/gems/1.8/gems/bundler08-0.8.5/lib/bundler08/resolve
r.rb:115:Warning: Gem::Dependency#version_requirements is deprecated and will be
removed on or after August 2010. Use #requirement
Downloading appengine-rack-0.0.11.pre.gem
Caching: jruby-jars-1.5.2.gem
Caching: jruby-rack-1.0.3.gem
Caching: rack-1.2.1.gem
Installing rack (1.2.1)
Installing jruby-rack (1.0.3)
Installing jruby-jars (1.5.2)
Installing appengine-rack (0.0.11.pre)
Done.
C:/ruby/jruby-1.5.2/lib/ruby/gems/1.8/gems/appengine-tools-0.0.16/lib/appengine-
tools/gem_bundler.rb:73 warning: already initialized constant RUBY_ENGINE
=> Packaging gems
=> Installing appengine-rack.jar
=> Installing jruby-core-1.5.2.jar
=> Installing jruby-stdlib-1.5.2.jar
=> Installing jruby-rack-1.0.3.jar
=> Generating rackup
=> Generating app.yaml


 

何が作られたか確認しよう、こんな感じだ。


hello
│ config.ru
│ Gemfile

├─.gems
│ └─bundler_gems
│ │ environment.rb
│ │
│ └─jruby
│ └─1.8
│ │ environment.rb
│ │
│ ├─cache
│ │ appengine-rack-0.0.11.pre.gem
│ │ jruby-jars-1.5.2.gem
│ │ jruby-rack-1.0.3.gem
│ │ rack-1.2.1.gem
│ │
│ ├─doc
│ ├─gems
│ │ ├─appengine-rack-0.0.11.pre
│ │ │ │ LICENSE
│ │ │ │ Rakefile
│ │ │ │
│ │ │ └─lib
│ │ │ │ appengine-rack.jar
│ │ │ │ appengine-rack.rb
│ │ │ │
│ │ │ └─appengine-rack
│ │ │ boot.rb
│ │ │
│ │ ├─jruby-jars-1.5.2
│ │ │ │ History.txt
│ │ │ │ Manifest.txt
│ │ │ │ README.txt
│ │ │ │
│ │ │ └─lib
│ │ │ │ jruby-core-1.5.2.jar
│ │ │ │ jruby-jars.rb
│ │ │ │ jruby-stdlib-1.5.2.jar
│ │ │ │
│ │ │ └─jruby-jars
│ │ │ version.rb
│ │ │
│ │ ├─jruby-rack-1.0.3
│ │ │ │ History.txt
│ │ │ │ LICENSE.txt
│ │ │ │ README.md
│ │ │ │
│ │ │ └─lib
│ │ │ │ jruby-rack-1.0.3.jar
│ │ │ │ jruby-rack.rb
│ │ │ │
│ │ │ └─jruby
│ │ │ └─rack
│ │ │ version.rb
│ │ │
│ │ └─rack-1.2.1
│ │ │ COPYING
│ │ │ KNOWN-ISSUES
│ │ │ rack.gemspec
│ │ │ README
│ │ │ SPEC
│ │ │
│ │ ├─bin
│ │ │ rackup
│ │ │
│ │ ├─contrib
│ │ │ rack_logo.svg
│ │ │
│ │ ├─example
│ │ │ lobster.ru
│ │ │ protectedlobster.rb
│ │ │ protectedlobster.ru
│ │ │
│ │ ├─lib
│ │ │ │ rack.rb
│ │ │ │
│ │ │ └─rack
│ │ │ │ builder.rb
│ │ │ │ cascade.rb
│ │ │ │ chunked.rb
│ │ │ │ commonlogger.rb
│ │ │ │ conditionalget.rb
│ │ │ │ config.rb
│ │ │ │ content_length.rb
│ │ │ │ content_type.rb
│ │ │ │ deflater.rb
│ │ │ │ directory.rb
│ │ │ │ etag.rb
│ │ │ │ file.rb
│ │ │ │ handler.rb
│ │ │ │ head.rb
│ │ │ │ lint.rb
│ │ │ │ lobster.rb
│ │ │ │ lock.rb
│ │ │ │ logger.rb
│ │ │ │ methodoverride.rb
│ │ │ │ mime.rb
│ │ │ │ mock.rb
│ │ │ │ nulllogger.rb
│ │ │ │ recursive.rb
│ │ │ │ reloader.rb
│ │ │ │ request.rb
│ │ │ │ response.rb
│ │ │ │ rewindable_input.rb
│ │ │ │ runtime.rb
│ │ │ │ sendfile.rb
│ │ │ │ server.rb
│ │ │ │ showexceptions.rb
│ │ │ │ showstatus.rb
│ │ │ │ static.rb
│ │ │ │ urlmap.rb
│ │ │ │ utils.rb
│ │ │ │
│ │ │ ├─auth
│ │ │ │ │ basic.rb
│ │ │ │ │
│ │ │ │ ├─abstract
│ │ │ │ │ handler.rb
│ │ │ │ │ request.rb
│ │ │ │ │
│ │ │ │ └─digest
│ │ │ │ md5.rb
│ │ │ │ nonce.rb
│ │ │ │ params.rb
│ │ │ │ request.rb
│ │ │ │
│ │ │ ├─handler
│ │ │ │ cgi.rb
│ │ │ │ evented_mongrel.rb
│ │ │ │ fastcgi.rb
│ │ │ │ lsws.rb
│ │ │ │ mongrel.rb
│ │ │ │ scgi.rb
│ │ │ │ swiftiplied_mongrel.rb
│ │ │ │ thin.rb
│ │ │ │ webrick.rb
│ │ │ │
│ │ │ └─session
│ │ │ │ cookie.rb
│ │ │ │ memcache.rb
│ │ │ │ pool.rb
│ │ │ │
│ │ │ └─abstract
│ │ │ id.rb
│ │ │
│ │ └─test
│ │ │ spec_auth_basic.rb
│ │ │ spec_auth_digest.rb
│ │ │ spec_builder.rb
│ │ │ spec_cascade.rb
│ │ │ spec_cgi.rb
│ │ │ spec_chunked.rb
│ │ │ spec_commonlogger.rb
│ │ │ spec_conditionalget.rb
│ │ │ spec_config.rb
│ │ │ spec_content_length.rb
│ │ │ spec_content_type.rb
│ │ │ spec_deflater.rb
│ │ │ spec_directory.rb
│ │ │ spec_etag.rb
│ │ │ spec_fastcgi.rb
│ │ │ spec_file.rb
│ │ │ spec_handler.rb
│ │ │ spec_head.rb
│ │ │ spec_lint.rb
│ │ │ spec_lobster.rb
│ │ │ spec_lock.rb
│ │ │ spec_logger.rb
│ │ │ spec_methodoverride.rb
│ │ │ spec_mock.rb
│ │ │ spec_mongrel.rb
│ │ │ spec_nulllogger.rb
│ │ │ spec_recursive.rb
│ │ │ spec_request.rb
│ │ │ spec_response.rb
│ │ │ spec_rewindable_input.rb
│ │ │ spec_runtime.rb
│ │ │ spec_sendfile.rb
│ │ │ spec_session_cookie.rb
│ │ │ spec_session_memcache.rb
│ │ │ spec_session_pool.rb
│ │ │ spec_showexceptions.rb
│ │ │ spec_showstatus.rb
│ │ │ spec_static.rb
│ │ │ spec_thin.rb
│ │ │ spec_urlmap.rb
│ │ │ spec_utils.rb
│ │ │ spec_webrick.rb
│ │ │ testrequest.rb
│ │ │
│ │ ├─cgi
│ │ │ lighttpd.conf
│ │ │ rackup_stub.rb
│ │ │ sample_rackup.ru
│ │ │ test
│ │ │ test.fcgi
│ │ │ test.ru
│ │ │
│ │ ├─multipart
│ │ │ bad_robots
│ │ │ binary
│ │ │ empty
│ │ │ fail_16384_nofile
│ │ │ file1.txt
│ │ │ filename_and_modification_param
│ │ │ filename_with_escaped_quotes
│ │ │ filename_with_escaped_quotes_and_modificatio_param
│ │ │ filename_with_percent_escaped_quotes
│ │ │ filename_with_unescaped_quotes
│ │ │ ie
│ │ │ nested
│ │ │ none
│ │ │ semicolon
│ │ │ text
│ │ │
│ │ ├─rackup
│ │ │ config.ru
│ │ │
│ │ └─unregistered_handler
│ │ └─rack
│ │ └─handler
│ │ unregistered.rb
│ │ unregistered_long_one.rb
│ │
│ └─specifications
│ appengine-rack-0.0.11.pre.gemspec
│ jruby-jars-1.5.2.gemspec
│ jruby-rack-1.0.3.gemspec
│ rack-1.2.1.gemspec

├─bin
│ rackup
│ rackup.bat

├─public
│ favicon.ico
│ robots.txt

└─WEB-INF
│ app.yaml
│ appengine-web.xml
│ web.xml

├─appengine-generated
│ bundled_jars.yaml

└─lib
appengine-rack.jar
gems.jar
jruby-core-1.5.2.jar
jruby-rack-1.0.3.jar
jruby-stdlib-1.5.2.jar




フレームワークって感じだ! Rackだね。
 


ローカルでテスト


とりあえずアプリケーションサーバを起動する、これもガイドに沿えばOK。

C:\ruby\works>jruby dev_appserver.rb hello

=> Booting DevAppServer
=> Press Ctrl-C to shutdown server

(略)

情報: The server is running at http://localhost:8080/


http://localhost:8080/ にて動作確認しよう、config.ru に書いてある内容が実行されるらしいのでちょちょいと文言を書き換えて起動。

// config.ru
run lambda {Rack::Response.new('Hello Work!').finish}


ブラウザで確認、出た出た。パスは何をリクエストしても同じ。

アプリケーションサーバー

※このあと8080で待ち受けてるjavaがちゃんと終了しない事がある、タスクマネージャから落とそう。
 
 



GAEへのデプロイ


で、これをGAEへ。

事前に準備。

  • GAEのダッシュボードでアプリケーションを新規登録する

  • アプリケーション名をapp.yamlに記入、ローカルフォルダ名とは別でOK
    application: sawanoboru
    version: 1
    runtime: jruby




ではappcfg.rbを使ってGAEへ。
途中でGoogleのアカウントを聞かれるので手で入力。

C:\ruby\works>jruby appcfg.rb update hello

=> Running AppCfg
Reading application configuration data...
2010/09/25 --:--:-- com.google.apphosting.utils.config.AppEngineWebXmlReader rea
dAppEngineWebXml
情報: Successfully processed hello\WEB-INF/appengine-web.xml
2010/09/25 --:--:-- com.google.apphosting.utils.config.AbstractConfigXmlReader r
eadConfigXml
情報: Successfully processed hello\WEB-INF/web.xml
Beginning server interaction for sawanoboru...
0% Creating staging directory
5% Scanning for jsp files.
20% Scanning files on local disk.
25% Initiating update.
Email: ********@gmail.com
Password for *********@gmail.com: ********

28% Cloning 2 static files.
31% Cloning 14 application files.
40% Uploading 5 files.
52% Uploaded 1 files.
61% Uploaded 2 files.
68% Uploaded 3 files.
73% Uploaded 4 files.
77% Uploaded 5 files.
80% 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% Closing update: new version is ready to start serving.
99% Uploading index definitions.

Update completed successfully.
Success.
Cleaning up temporary files...



無事に上がった、↓から確認できます。

http://sawanoboru.appspot.com/


 
 

さてこの後がアプリケーション開発的には本番なんだけど、ひとまずRubyをGAEで動すことの敷居はずいぶん下がったなと思います。
 

このあとはBigTableの使い方とかを調べていかないとね。
 
 

3 件のコメント:

GAEでjruby、windowsからデプロイ・前編 | SawanoBlog 2G さんのコメント...

[...] 後編はこちら。   参考にした記事。 10分ではじめる GAE/JRuby (OAuth + Sinatraのサンプル) – まちゅダイアリー(2009-09-03) [...]

GAEでjruby、windowsからデプロイ・後編 | SawanoBlog 2G さんのコメント...

[...] Read the original:  GAEでjruby、windowsからデプロイ・後編 | SawanoBlog 2G [...]

bakuris さんのコメント...

I would like to exchange links with your site www.sawanoboly.net
Is this possible?

コメントを投稿