2011-07-20 105 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

相關問題