石锅拌饭

尝试用capistrano部署ruby on rails应用

by Robin Lu on Aug.27, 2006, about

部署网络应用服务是很麻烦的事情,安装程序,升级数据库schema,切换版本,重启服务。步骤越多,人工参与越多,越容易出问题。
Capistrano是ruby on rails提供的部署方案,原名叫SwitchTower,多好记的名字,结果和人重了,换成现在这个,估计是为了赌气才起成这样,反正我再也不能拼对了。它集成了很多部署程序必须的步骤,借助ssh、版本管理系统(支持svn、cvs等等好几种)和rails的migration,只要做好配置,就可以在很大程度上实现部署自动化。
Capistrano的相关文档可以看这里。最简单的使用方法是:

  1. 安装

    gem install capistrano

  2. 加入capistrano支持

    cap --apply-to /path/to/my/app MyApplicationName

  3. 修改配置文件

    修改config/deploy.rb文件。

  4. 初始化服务器上的运行环境

    rake remote:exec ACTION=setup
    这一步会连上你的服务器,创建一些目录。

  5. 部署

    rake deploy
    连接服务器,完成部署。

说起来好像挺简单,麻烦的地方主要在于修改config/deploy.rb配置文件。一般来说主要配置的参数包括:

  • application:应用名。
  • repository:版本管理系统的链接URL。
  • web:web服务器名列表。
  • app:应用服务器列表。
  • db:数据库服务器列表。
  • user:ssh用户名。
  • deploy_to:应用部署路径。

如果你的svn链接需要用户名和密码,可以通过svn_username和svn_password配置,文档中没写,算我免费友情提示。
除了setup和deploy,缺省支持的命令主要有:

  • disable_web:生成maintenance.html,你的系统需要能够自检测这个文件。
  • enable_web:删除maintenance.html。
  • update_code:和版本管理器做代码同步。
  • rollback_code:如果部署完发现有问题,可以用这个命令换回上一个。
  • restart:重启,其实就是调用了reaper。
  • migrate:在服务器端运行rake RAILS_ENV=#{rails_env} migrate。
  • deploy:其实就是update_code+symlink+restart。
  • deploy_with_migrations:update_code+migrate+symlink+restart。
  • rollback: rollback_code + restart。

还有一些其它的命令,具体可以查看gem capistrano安装目录下lib/recipes中的standard.rb。另外,可以自己在deploy.rb中定义新的命令。
目前的capistrano(版本1.1.0)还有一些局限,比如你所有服务器都必须使用同样的账号,这个让我在dreamhost上部署碰到了一点麻烦。总的来说还是比较方便的。

:

2 Comments for this entry

  • cap

    终于从1.1.0重新支持reaper了
    不知道你遇到过一个问题没有

    我有一个upload目录(是用户上传资料,不在svn中),每次更新,capistrano都重新建立一个新目录,导致新应用upload里面的文件都丢失了,俺得手动把他们移动到share里面然后作link回当前版本的目录, 不知道兄台如何搞定的?

  • Robin Lu

    你可以查看capistrano在服务器端创建的目录结构,除了current, release还有一个叫shared,在update_code这个action中,每次会把shared/log连接到新release中的/log,把shared/system连接到新release中的system,这样保证了每次更新后log目录和system目录都是不变的。
    对于你的问题可以有两个做法,一个就是把upload目录放在shared/system目录下,这样做最简单。另一个方法,就是把upload目录放在shared/目录下,然后自己写一个task来完成ln的过程,这个稍微麻烦一些。

5 Trackbacks / Pingbacks for this entry

Search

Archives

Browse by tags

agile apple blog book design ecto extension firefox git google hack ichm iphone keyword life mac madfox movie nonsense opensource plugin pm ruby rubyonrails sns software startup wordpress work 财帮子