dotCloudでRails3.2.9とpostgresqlを動かす

therubyracerがアレすぎですが、herokuよりはやりやすかった。sshできるのが大きいです。
gemfileにtwitter-bootstrapとかless-railsとか積んでると面倒かも。

自分のPCで

> pybrew use Python-2.7.3
> pip install dotcloud
> cd APP_ROOT
> dotcloud create [appname]
> vi dotcloud.yml
www:
  type: ruby
db:
  type: postgresql
> git add .
> git ci -m 'add yml'

dotcloudにアプリをアップ

> dotcloud push

dotcloudにデータベースを作成

> dotcloud run db
# createdb [dbname]
# exit

アップされたrailsアプリを動くように色々作業

> dotcloud run www
$ cd current
$ rm -rf vendor/bundle # 自分のPCではvendor/bundleにbundle installしているので削除
$ rm .bundle # 設定も削除
$ vim Gemfile
gem 'therubyracer', '0.11.0beta8', :platforms => :ruby # therubyracerが0.11.0beta8じゃないとbundle installが失敗する
$ bundle install

データベースの設定を記述

$ cat ../environment.yml
$ vi config/database.yml # productionを編集

具体的には、

<% 
require 'json'
env = JSON.parse(File.read('/home/dotcloud/environment.json'))
%>
production:
  adapter: postgresql
  encoding: unicode
  database: [dbname]
  pool: 5
  username: <%= env['DOTCLOUD_DB_SQL_LOGIN'] %>
  password: <%= env['DOTCLOUD_DB_SQL_PASSWORD'] %>
  host: <%= env['DOTCLOUD_DB_SQL_HOST'] %>
  port: <%= env['DOTCLOUD_DB_SQL_PORT'] %>

ここに書いてある
http://docs.dotcloud.com/0.9/guides/environment/

rake db:migrateの実行

$ rake db:migrate RAILS_ENV=production
$ exit

自分のPCに戻って、dotcloud open

これだとdotcloud pushしたときに設定が全部上書きされてしまうので、作業側のコードも編集しておき、rbenvあたりでgem管理しておけばいいかも。

広告

Rails, capistranoの設定メモ

rails3.2で色々な環境にデプロイしようとしたcapistrano設定のメモ
もっとよい設定があると思うけど、動くのでこれで。

Gemfileには書かない。

gem install capistrano capistrano-ext

group :developmentから:productionに変更。

vim Gemfile
 gem 'therubyracer'

capifyは実行済み。

mkdir config/deploy
touch config/deploy/production.rb
touch config/deploy/staging.rb

共通設定をconfig/deploy.rbに記述
config/deploy.rbの先頭に、require “capistrano/ext/multistage” を記述する。

ステージング環境(結合環境)は自分自身にデプロイしたい。

vim config/deploy/staging.rb
 set :deploy_to, "/path/to/dir"
 set :ssh_options, { :forward_agent => true }
 role :web, '127.0.0.1'
 role :app, '127.0.0.1'
 #role :db, '127.0.0.1', :primary => true

本番環境config/deploy/production.rbはいつもどおりに記述。

deploy:assets:precompileやcleanを実行できるようにする。

vim Capfile
 load 'deploy/assets' #コメントアウトを外す

deploy時にbundle installを実行したい。
config/deploy.rbにrequire “bundler/capistrano” を記述する。
deploy:update_code→bundle:installの順番に実行される?

deploy:assets:precompileをbundle:installの後に実行する。

vim config/deploy.rb
 before('deploy:assets:precompile', 'bundle:install')

deploy時にbundle execがうまく動かないことがあるので、cap deployを実行している.bundle/configのシンボリックリンクを作ったりする。shared_pathにファイルを置いておく。
(cap bundle:installしたときの.bundle/configファイル)

vim config/deploy.rb
 namespace :deploy do
   task :bundlesymlink do
     run "cp #{shared_path}/config/bundle_config #{release_path}/.bundle/config"
   end
 end
 before('bundle:install','deploy:bundlesymlink')

ステージング環境でのデプロイ方法は、

cap staging deploy

Rails, Cucumberでfeatureで前提にログイン済み状態

背景の前提で、ログインしている状態にしておくメモ。

steps.rb

Given /^"(.*)"でログインしていること$/ do |login|
  @current_user = Admin.create!(
    :login => login,
    :password => "testtest",
    :password_confirmation => "testtest",
    :email => "foobar@example.com")
  visit "/session/new"
  fill_in("ログインID", :with => login)
  fill_in("パスワード", :with => "testtest")
  click_button("ログイン")
  response.body.should =~ /ログインしました。/m
end

feature

背景:
  前提 "foobar"でログインしていること

シナリオ:
 ....

Rails, 国際化の件

いつも忘れてしまうので、とりあえずの国際化メモ。

sudo gem install amatsuda-i18n_generators
./script/generate i18n ja
./script/generate i18n en

生成されたファイル。

config/locales/translation_ja.yml #モデルまわり
config/locales/translation_en.yml

config/locales/action_view_en.yml
config/locales/active_record_en.yml
config/locales/active_support_en.yml

config/locales/ja.yml #上記の3ファイルがまとめて生成されてる?

バリデーション関係は特に弄らずそのまま。

コントローラーとかでflash[:notice]やる場合に、

flash[:notice] = t(:created_success, :model => Post.human_name)

こんな感じ。

たぶんこんなのが出る。

translation missing: ja, created_success

出たら、


vi config/locales/ja.yml
ja:
created_success: “{{model}}を作成しました。”

みたいに追加しておく。

すると、「記事を作成しました。」と表示される。

Rails, RSpecとCucumberのautospecをgrowlに通知する

やっぱりgrowlにも通知しておきたい。

以前rspecに設定した.autotestを編集します。

# -*- ruby -*-
 require 'autotest/redgreen'
module Autotest::Growl
  def self.growl title, msg, img="~/.rails_ok.png", pri=0, sticky=""
    msg += " at #{Time.now.strftime('%Y-%m-%d %H:%M:%S')}"
    system "growlnotify -n autotest --image #{img} -p #{pri} -m #{msg.inspect} #{title} #{sticky}"
  end

  Autotest.add_hook :ran_command do |at|
    results = [at.results].flatten.join
    ex = results[/(\d+)\s+example?/].to_i
    fa = results[/(\d+)\s+failure?/].to_i
    er = results[/(\d+)\s+error?/].to_i
    num = fa + er
    if ex &gt;= 0
      if num.to_i &gt; 0
        output = "#{fa} failures, #{er} errors"
        growl "RSpec Failed", "#{output}", "~/.rails_fail.png", 2, "-s"
      else
        growl "RSpec Passed", "#{ex} examples passed", "~/.rails_ok.png", -2
      end
    else
      growl "RSpec Errored", "errors", "~/.rails_fail.png", 2, "-s"
    end
  end
  
  Autotest.add_hook :ran_features do |at|
    results = [at.results].flatten.join
    sc = results[/(\d+)\s+scenario?/].to_i
    sk = results[/(\d+)\s+skipped?/].to_i
    pe = results[/(\d+)\s+pending?/].to_i
    un = results[/(\d+)\s+undefined?/].to_i
    fa = results[/(\d+)\s+failed?/].to_i
    pa = results[/(\d+)\s+passwd?/].to_i
    st = results[/(\d+)\s+step?/].to_i
    num = sk + pe + fa + un
    if sc &gt;= 0
      if num.to_i &gt; 0
        output = "#{sk} skipped, #{un} undefined, #{pe} pending, #{fa} failed"
        growl "Cucumber Failed", "#{output}", "~/.rails_fail.png", 2, "-s"
      else
        growl "Cucumber Passed", "#{sc} scenarios, #{st} steps passed", "~/.rails_ok.png", -2
      end
    else
      growl "Cucumber Errored", "errors", "~/.rails_fail.png", 2, "-s"
    end
  end
end

いい感じ。