在前两篇中,我简要总结了如何搭建webistrano平台和capistrano项目配置的相关的东西 。其中capistrano是基础,如果在配置完webistrano的项目后,在执行发布的过程中出现报错都问题,可以通过capistrano先进行命令行的验证和验证,一般web界面的问题,都会在命令行下重现,通过命令行下找到解决方法,在webistrano进行相应的配置也就可以解决了。本篇的重点是通过对webistrano中几个主要功能块进行介绍,从而了解如何利用webistrano搭建一个自动化发布的项目。

一、projects

项目比较好理解,这个比如就以我的个人blog站点为例,其中可以是一个项目,创建一个项目只需要添写三块信息 。如下:

projects

其中project type 是较为重要的一项 ,我们可以将projcet type看作项目模板文件,可以减少项目部署的步骤。后面对模板会专让说明。

二、stage

stage 可以理解为环境类型,比如一个站点有生产环境、测试环境、开发环境等 ,每个环境会发布到不同的主机 。可以配置多个stage同主机之间关联,每次发布的时候通过指定stage类型,就可以发布项目到相应的环境 。

stage

关于stage,webistrano页面上给的说明里有一句是这样的:Typical examples are a different repository path (e.g. trunk) or a different Rails environment

注:这里需要注意下,想要通过邮件可以正常通知,需要在主机上开启sendmail服务 。

三、增加project type

这里如果将project type译成项目类型个人感觉并不贴切,将其理解为 模板 更贴切,默认安装好的情况下,只有六个模板,都是和ruby项目相关的。不过我们可以自定义增加其他模板文件。

如下,我在模板目录下,增加了一个resin项目发布的一个模板,其中定义了三个task(具体可以参看capistrano里的task的概念)---restart、start、stop ,

 1$ pwd
 2/opt/webistrano/lib/webistrano/template
 3$ cat resin_web.rb
 4module Webistrano
 5  module Template
 6    module ResinWeb
 7      CONFIG = Webistrano::Template::Base::CONFIG.dup.merge({
 8      }).freeze
 9      DESC = <<-'EOS'
10        Template for use with resin projects that update  files and restart resin.
11        The basic (re)start/stop tasks of Capistrano are overrided with restartstartstop tasks.
12      EOS
13      TASKS = Webistrano::Template::Base::TASKS + <<-'EOS'
14         namespace :deploy do
15           task :restart, :roles => :app, :except => { :no_release => true } do
16             run "#{try_sudo} setsid /etc/init.d/resin restart"
17           end
18           task :start, :roles => :app, :except => { :no_release => true } do
19             run "#{try_sudo} setsid /etc/init.d/resin start"
20           end
21           task :stop, :roles => :app, :except => { :no_release => true } do
22             run "#{try_sudo} setsid /etc/init.d/resin stop"
23           end
24         end
25      EOS
26    end
27  end
28end

在此处增加完模板,在web界面上还无法展示和选择,还需修改另外两个文件。如下:

 1//文件1
 2$ cat /opt/webistrano/lib/webistrano/template.rb
 3require "webistrano/template/base"
 4require "webistrano/template/rails"
 5require "webistrano/template/mongrel_rails"
 6require "webistrano/template/thin_rails"
 7require "webistrano/template/pure_file"
 8require "webistrano/template/mod_rails"
 9require "webistrano/template/unicorn"
10require "webistrano/template/resin_web"
11//文件2
12$ cat /opt/webistrano/app/models/project_configuration.rb
13class ProjectConfiguration < ConfigurationParameter
14  belongs_to :project
15  validates_presence_of :project
16  validates_uniqueness_of :name, :scope => :project_id
17  # default templates for Projects
18  def self.templates
19    {
20      'rails' => Webistrano::Template::Rails,
21      'mongrel_rails' => Webistrano::Template::MongrelRails,
22      'thin_rails' => Webistrano::Template::ThinRails,
23      'mod_rails' => Webistrano::Template::ModRails,
24      'pure_file' => Webistrano::Template::PureFile,
25      'unicorn' => Webistrano::Template::Unicorn,
26      'resin_web' => Webistrano::Template::ResinWeb
27    }
28  end
29end

配置完成后,重启nginx服务器(这里以上篇中的passenger整合方式为例)并登录后,在create project 里的类型里就可以看到新增的resin_web项。

四、recipes

创建一个recipe的方法如下:

recipes

recipe 可以理解为模板文件的扩展 ,其中模板文件侧重于通用性,通过recipe的扩展功能,又可以增加模板文件的个性化 。举一个简单的例子:在生产环境中,很多程序会有守护进程,一旦发现程序运行不正常就会重启应用,而在升级过程中就需要先将守护进程停掉再进行升级操作,但在开发和测试环境中就没必要做守护进程。这时就可以通过 recipe 对模板进行扩展,在 body里指定在进行程序update 前,先 kill 掉守护进程。

如上面的图中,即在执行完发布链接后,再执行drupal:symlink_files 和 drupal:refresh_configuration操作。这里使用after关键词,如果想在某task之前执行其他task,同样可以使用before ,具体参看capistrano 主页

注:task里的命令执行有run、system、invoke_command、run_locally、execute 几种,根据需要实现的输出和版本的不同,用法也有区别,具体区别参看官方文档

五、变量

默认在创始项目时,会有一个base模板,当我们新增项目时,一般需要我们填写如下的变量及其值

project-value

变量通过 #{变量名} 在模板或recipe里调用 ,这里的变量也有点类似于编程语言,分为系统变量和自定义变量(方便理解,个人这样定义的),其中像deploy_to、deploy_via 这类的在系统里已经进行过定义,这种我就称其为系统变量。只需要指定name和value,发布时,系统会自动check value值;自定义变量,是我们在设定模板时或recipe里进行调用,如第四部分中的 drush_options 就是自定义变量。

这里以新增一个发布版本变量为例 :

value

上面我们新增的还是一个系统变量,该变量的作用就是在使用svn或git做为发布源时,可以通过修改该变量的值,发布特定的发布版本。具体可以查看capistrano下的subversion.rb和git.rb文件里的代码。如果想增加一个自定义变量时,不知道其是否已作为系统变量里进行了指定,可以利用grep -r “变量名” 的方式在原代码里进行查找。

六、stage、recipe、hosts、role进行关联

stage是recipe 、hosts、 role 进行关联的关键,打开stage的项目页面,可以找到下面的部分,通过mange stage recipes 和 add host 打通几者之间的关系。

stage-link

关联recipes

stage-recipe

新增主机

stage-host

七、项目发布

发布界面如下,可以通过export capfile 查看当前的配置。在右上角的deloy选择中,选择相应的操作并执行即可完成task任务的执行和发布

deployproj