使用webistrano发布一个resin项目

2014年6月29日 发表评论 阅读评论

最近几天通过对webistrano和capistrano的搭建和了解,开始在公司的内部测试平台上应用webistrano 。目前需要部署的是个resin应用,需要通过webistrano实现的目标:

  • 目录与环境的自动创建
  • 自动代码check ( svn或git )
  • 配置文件的自动修改
  • resin服务的web启停

一、project type模板

这里使用的的模板为 webistrano项目配置 中的模板文件,如下:

$ cat resin_web.rb
module Webistrano
  module Template
    module ResinWeb
      CONFIG = Webistrano::Template::Base::CONFIG.dup.merge({
      }).freeze
      DESC = <<-'EOS'
        Template for use with resin projects that update  files and restart resin.
        The basic (re)start/stop tasks of Capistrano are overrided with restartstartstop tasks.
      EOS
      TASKS = Webistrano::Template::Base::TASKS + <<-'EOS'
         namespace :deploy do
           task :restart, :roles => :app, :except => { :no_release => true } do
             run "#{try_sudo} setsid /etc/init.d/resin restart"
           end
           task :start, :roles => :app, :except => { :no_release => true } do
             run "#{try_sudo} setsid /etc/init.d/resin start"
           end
           task :stop, :roles => :app, :except => { :no_release => true } do
             run "#{try_sudo} setsid /etc/init.d/resin stop"
           end
         end
      EOS
    end
  end
end

该模板同样适用于tomcat项目,只需要将其中的脚本名称修改掉即可。

注:上面的setsid 也可以使用nohup ,这两个不加的情况在start时,会出现在ps里查看时,程序启动后又自动关闭了(由于webistrano远程过来的主进程运行完退出终目后,子进程也终止了,使用nohup和setsid可以解决该问题)。

二、recipes 配置

在发布项目时,会遇到使用svn或git checkout到远程目录时没有写入权限的问题,引了下原因,是因为capistrano在check时没有使用#{try_sudo}导致的,又不想去修改capistrano的源代码(相对麻烦),可以通过在recipes里增加task 解决code update时的权限问题。

另外在项目发布时,还会遇到需要删除.svn或.git 的问题自动更改配置文件的问题,这里的recipes主要就是为了解决以上三个问题,如果有其他问题,也可以在此基础上进行增加task ,代码如下:

namespace :resin do
  desc "change_permi"
  task :change_permi do
    run "#{try_sudo} chown -R  #{runner}:#{runner} #{deploy_to}"
  end
  desc "del_svn"
  task :del_svn do
    run " #{try_sudo} rm -rf `find #{latest_release} -type d -name .svn` "
    run "cd #{latest_release} && #{try_sudo} rm -rf public tmp log"
    run "mv #{latest_release}/WEB-INF/classes/config.properties #{latest_release}/WEB-INF/classes/config.properties.bak"
  end
  desc "replace_conf"
  task :replace_conf do
     resin_config =<<-EOF
ymconvHost=172.20.0.43
#ymconvHost=hou.ymtrack.com
ymconvPort=8080
ymconvRoute=ymconvhttpdao
redis.host=localhost
redis.port=6378
urlsyncDelay=1000
    EOF
    put resin_config, "#{latest_release}/WEB-INF/classes/config.properties"
  end
end
before 'deploy:update','resin:change_permi'
after 'deploy:update','resin:del_svn','resin:replace_conf'

需要注意的是这里文件是通过先写到一个类似变量里,再put上去的 。在此之前我试图通过cat EOF的方式直接写入文件发现是行不通的。

注:在del_svn中的mv 语句可以不要,后面的 replace_conf中的put语句在存在原文件时,会自动覆盖原文件。这里便于理解,我并没有删除。

一点题外话

capistrano里的语法十分灵活,比如有多个shell 语句需要执行时,可以利用上例中的put语句写入到文件再执行,也可以使用each 定义一个task逐条执行,如下:

  task :aaaa do
    [
    "mkdir -p /tmp/src",
    "cd /tmp/src && wget http://nginx.org/download/nginx-1.6.0.tar.gz",
    "cd /tmp/src && tar xvzf nginx-1.6.0.tar.gz"
    ].each {|cmd| run cmd}
    end

需要注意两点:1、每条命令后面的逗号不能少 ;2、每条命令完,相当于退出再执行下一条 ,如上面的例子中,如果我用的是root用户,后面两条命令如果不加前面的cd 语句部分,nginx就会下载的/root目录 ,并解压到/root 目录 。

上面两步配置完成后,在web界面上做stage、host、recipes、roles的关联后,在stage界面依次执行 deploy:setup ----> deploy:update  -----> deploy:start  ,即可以完成一个resin项目会环境部署到启动的所有步骤。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 2014年7月10日16:19 | #1

    博主你好,我发布到服务器上的文件,比如说是发布到/var/www/html/里面的,结果发布过去之后,结果是/var/www/html/release/xxxxx /var/www/html/current/ 等等,这些是要手动去处理一下吗?按理说不是应该把我的网站程序直接发布到/var/www/html/里面吗?

    • admin
      2014年7月12日23:47 | #2

      默认发布的目录是/site-root/current/ ,因为其版本是基于软链接的,可以方便的进行版本回滚 。如果想通过修改webistrano来实现你来的效果会必较麻烦,建议通过修改nginx或tomcat程序site-root的路径相对更简单些。

  1. 本文目前尚无任何 trackbacks 和 pingbacks.