使用capistrano和git将相同的代码库与轻微差异部署到多个服务器

时间:2011-07-20 14:46:57

标签: git cakephp deployment capistrano

我们有一个代码库,我们销售给多个客户。我们使用git进行版本控制,使用Capistrano进行自动部署。

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

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

一旦代码在staging上进行了测试,我们就可以发布了,我们将staging合并到master中。然后我们必须部署到不同的客户端服务器。我们为每个客户端提供了一个临时和生产服务器。

目前,我们为每个客户提供了一个临时和生产分支,并从每个单独的分支部署到每个服务器。这变得很痛苦,因为我们必须将主项目分支合并到每个客户端的登台/生产分支以及每个服务器的运行cap deploy

我们如何从一个分支部署到客户端服务器,但是包含每个客户端服务器工作和看起来正确所需的不同文件?

1 个答案:

答案 0 :(得分: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' 

在config / deploy.rb中是我的主要部署脚本。

在config / deploy中,我为每个环境都有一个脚本。即prod.rb和test.rb。

这些特定于环境的脚本包含特定于这些环境的变量。通常,我指定诸如branch,user,app,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"

我应该提一下我为deploy_via使用git和copy策略。结果,所有配置都被上传到服务器中的目录,然后复制到位。您的里程可能会有所不同。

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