背景:


本地: 192.168.100.8) xp,
rails服务器: 192.168.100.231 centos 3
svn服务器:192.168.100.212 centos 4

通过本地脚本部署应用到rails服务器

1)本地安装capistrano


gem install capistrano

2)检查安装是否有效


cap -V

本文看到结果:Capistrano V2.1.0,说明安装成功

3)开始工作

进入本地 rails工程根目录执行



capify .

这个命令会生成两个文件,一个是Capfile文件,在应用的根目录下,另一个是deploy.rb文件,在应用的config目录下
可以用cap -T 查看所有task, cap -e deploy 解释deploy任务的详情 。

4)修改config/deploy.rb文件




set :application, "space"
set :repository, "http://192.168.100.212:3690/repo/moxtv/branches/space"



# If you aren''t deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"

# If you aren''t using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion



role :app, "192.168.100.231"
role :web, "192.168.100.231"
role :db, "192.168.100.231", :primary => true

#1
set :svn_username, "weip"
set :svn_password, "weip"

#2
set :deploy_to, "/var/www/webapps/#{application}"
set :user, "root"
set :password, "secretpa"


#3
set :use_sudo,false

#4
task :chmod, :roles => :web do
run "chmod -fR 755 #{deploy_to}/current/script/*"
end

after "deploy:symlink", :chmod

#5
default_environment["PATH"] ="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/ruby/bin:/usr/local/ant/bin:/usr/java/jdk1.5.0_05/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin"


额外添加了5个部分
#1 指定SVN用户名密码

#2 指定远程目的服务器的用户名和密码

#3 因为懒得配置SUDO,所以加上这行,直接用ROOT访问,否则会有权限问题

#4 为了能使目的服务器能执行脚本,特意加上全县,否则会有权限问题

#5 显示的指明路径,否则互有如下问题

比如
问题1:



cap:start
* executing `deploy:start''
* executing "sh -c ''cd /var/www/webapps/space/current && nohup script/spin''"
servers: ["192.168.100.231"]
[192.168.100.231] executing command
*** [err :: 192.168.100.231] /var/www/webapps/space/current/script/spin: line 1: mongrel_rails: command not found
command finished
command "sh -c ''cd /var/www/webapps/space/current && nohup script/spin''" failed on 192.168.100.231





问题2

cap:restart

* executing `deploy:restart''
* executing "/var/www/webapps/space/current/script/process/reaper"
servers: ["192.168.100.231"]
[192.168.100.231] executing command
*** [err :: 192.168.100.231] /var/www/webapps/space/current/script/process/../../config/boot.rb:18:in `require'': no such file to load -- rubygems (LoadError)
*** [err :: 192.168.100.231] from /var/www/webapps/space/current/script/process/../../config/boot.rb:18
*** [err :: 192.168.100.231] from /var/www/webapps/space/current/script/process/reaper:2
command finished
command "/var/www/webapps/space/current/script/process/reaper" failed on 192.168.100.231



文档
http://www.mail-archive.com/capistrano@googlegroups.com/msg02196.html
作了些解释, capistrano 会从默认的ruby路径加载gem或者程序,如果你是用
./configure --prefix方式安装的ruby 并且修改/etc/profile中的ruby path,很有可能就会出现这种问题
所以最好还是指定path,作者也说会修正这个问题,让我拭目以待


5)在#{rails_app_root}/script目录创建spin文件

用于启动服务器,
在本文中是:


mongrel_rails start -e production -p 8080 -r /var/www/webapps/space/current/public -l /var/www/webapps/space/current/log/m.log -P /var/www/webapps/space/current/tmp/pids/dispatch.0.pid -d
本文使用的是mongrel单机服务器,-d参数一定要加,否则不会产生log和pid,这将导致cap:restart无法正常运行

到此一切准备就绪,开始运行

6)部署准备


cap deploy:setup
这一步会连上服务器,创建一些目录:
ruby 代码



#{deploy_to}/
#{deploy_to}/releases
#{deploy_to}/shared
#{deploy_to}/shared/log
#{deploy_to}/shared/system
#{deploy_to}/shared/pids

releases目录里面会存放所有的发布版本
shared目录是为了共享文件
在第一此部署后还会产生一个current链接,它会自动指向releases目录里面最新的版本

7)启动服务器

cap deploy:start


8)部署


cap:deploy

一旦有任何修改,提交到版本服务器,那么执行该命令就能自动完成部署工作,在本文中就是把最新本版checkout到rails服务器上,然后重启服务器,一个命令就搞定了


总结 :
本文通过使用capistrano 一键搞定自动部署,其实也完全可以自己写脚本,比如之前我们在服务器上写了个脚本,执行checkout和重启的命令,但麻烦的是如果把应用部署到多个机器,就有可能在每个机器上执行一遍,当然也仍然可以写脚本搞定这些,但有这么好的工具何必再麻烦,
如果仅部署一台机器,感觉本地执行capistrano命令稍微有点慢不如我以前写的单机脚本快,但如果部署多台,优势就体现出来了,毕竟mongrel集群用的多,况且capistrano 也不仅仅限于checkuout和启动服务器,还有数据库部署之类的功能,这个还有待进一步研究,祝大家cap愉快