使用Capistrano和Git将多个应用程序部署到单个树中


Deploying multiple applications into a single tree with Capistrano and Git

我正在尝试使用Capistrano部署一个PHP网站。该网站由4个组件(前端代码和3个web服务)组成,每个组件都存储在自己的git存储库中。我想将所有4个组件部署到一个单一的树结构中(见下文),这样在网站版本之间切换就可以像移动"当前"链接一样简单。

我看到,默认情况下,Capistrano部署是为部署单个存储库而设计的。如果我理解正确的话,即使使用像Caphub这样的东西也不会对我有帮助,因为这4个组件将部署到4个不同的树中,这使得回滚到特定的时间点是一个繁琐的过程。

有没有一种方法可以使用Capistrano获得下面的配置?这种情况下的最佳做法是什么?

root/
| current/
| releases/
| | <timestamp/>
| | | frontend/
| | | webservice-1/
| | | webservice-2/
| | | webservice-3/
| | <timestamp/>
| | | frontend/
| | | webservice-1/
| | | webservice-2/
| | | webservice-3/
| shared/

更新:

按照公认答案中的建议,使用子模块解决方案结束。我创建了一个包含4个子模块的网站存储库和一个保存capistrano部署文件的网站部署存储库。我写了一个简单的shell脚本,省去了每次部署时更新子模块的麻烦(这是一个相当繁琐的过程!)。为了部署,我运行脚本(下面的源代码),然后运行"cap-deploy"。

#!/bin/sh 
git clone gitserver:path_to_git_repositories/website.git cloned 
cd cloned 
git submodule init 
git submodule update 
git submodule foreach git pull origin master # updating all modules to the current code in the master branch
git submodule foreach git add .  
git commit -a -m "Updating submodules" 
git push origin master 
cd .. 
rm -rf cloned 

我在部署rails应用程序和一个Web服务时遇到了非常类似的问题。我决定使用git子模块,它应该可以解决您的所有问题。

您只需要创建一个主git存储库,它将添加前端和所有Web服务作为子模块。然后在capistrano中,您只需指向这个主存储库,并将git_enable_submodules设置为1。

然后,您可以单独开发所有4个组件,当您想要部署时,只需更新子模块以更正点并提交主存储库。这种方法应该提供与您所展示的完全相同的目录布局,并且应该使回滚变得容易。

我在尝试使用Capistranov3.6执行由3个独立Git存储库组成的web应用程序的原子部署时遇到了同样的问题。

正如您所讨论的,我使用了子模块方法,但以一种更自动化的方式,对于v3(看到post的日期,可能是v2)。

步骤

  1. 有1个回购用于Cap配置,另外1个用于将主要项目回购分组为子模块
    set :repository, 'submodules-repo-url'
  2. 替换Cap的Git策略以支持子模块(支持v2,在v3中删除)
    在此处查找脚本
    set :git_strategy, SubmoduleStrategy
    上面的策略负责更新子模块,所以它就像一个简单的Git回购
    它将当前版本下的子模块作为单独的文件夹获取,就像您的大纲中一样
  3. cap deploy并享受

我写了一篇关于它的博客文章,更多信息可以在这里找到。