2011-07-20 76 views
4

我们有一个代码库,我们销售给多个客户端。我们使用git进行版本控制,并使用Capistrano进行自动化部署。通过capistrano和git部署相同的代码块,并向多个服务器部署相同的代码块

部署之间存在细微的差异,例如设计布局,css文件,徽标和配置文件,例如CAKEPHP的前端控制器,其中包含应用程序路径和cakephp目录。

我们目前拥有该项目的主要/分期分支。我们在主题分支中进行开发,一旦主题分支准备好合并到代码库中,我们将主题分支合并到分段并部署到主分段服务器。

一旦代码已经过测试,我们准备发布我们合并到主。然后我们必须部署到不同的客户端服务器。我们为每个客户端都有一个分段和生产服务器。

目前我们为每个客户端都有一个分段和生产分支,我们从每个单独的分支部署到每个服务器。这变得非常痛苦,因为我们必须将我们的主项目分支合并到每个客户的分段/生产分支中,并为每个服务器运行cap deploy

我们如何才能从一个分支部署到客户端服务器,但包含每个客户端服务器工作所需的不同文件并且看起来合适?

回答

1

我用capistrano/ext/multistage做类似的事情。

交付生产时,我可以使用cap prod deploy,在交付测试时,我可以使用cap test deploy

我Capfile看起来像

require 'rubygems' 
require 'railsless-deploy' 
require 'capistrano/ext/multistage' 

set :stages, %w(staging) 

load 'config/deploy' 

在配置/ deploy.rb是我的主要部署脚本。

在配置/部署我有一个脚本为每个环境。即prod.rb和test.rb.

这些特定于环境的脚本包含特定于这些环境的变量。通常,我指定诸如分支,用户,应用程序,deploy_to,copy_remote_dir,copy_exclude和我需要在主要config/deploy.rb中使用的其他变量,这些变量在环境之间可能会有所不同。

某些变量可能不会出现在所有环境特定的脚本中,因此deploy.rb在使用它们之前检查它们的存在。即

# Link upload area 
if exists?(:uploads) 
    run "rm -rf #{current_release}#{uploads}" 
    run "ln -s #{shared_path}#{uploads} #{current_release}#{uploads}" 
end 

有时,我会复制的环境特定的配置,采用分期名

# Copy config 
run "cp #{current_release}/config/#{stage}/app/config.php #{current_release}/src/app" 

我要提到我使用Git并复制策略我deploy_via。因此,所有配置都会以不在目录中的方式上传到服务器,然后复制到位。你的旅费可能会改变。

在此处了解有关卡普施拉诺多级扩展的更多信息:http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage

相关问题