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

时间:2012-03-25 13:43:18

标签: php git deployment capistrano git-submodules

我正在尝试使用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 

2 个答案:

答案 0 :(得分:2)

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

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

然后,您可以单独开发所有4个组件,当您要部署时,只需更新子模块以更正点并提交主存储库。这种方法应该准确地给出这个目录布局,并且应该可以很容易地回滚。

答案 1 :(得分:1)

我尝试使用Capistrano v3.6 执行包含3个独立Git存储库的Web应用程序的原子部署时遇到了同样的问题。

我使用的Submodules方法正如您所讨论的那样,但是以更自动化的方式和v3(查看帖子的日期,可能是v2)。

<强>步骤

  1. Cap配置有1个repo,另外1个用于将主项目repos分组为子模块 set :repository, 'submodules-repo-url'
  2. 替换Cap的Git策略以支持子模块(支持v2,在v3中删除)。
    Find script here
    set :git_strategy, SubmoduleStrategy
    上面的策略负责更新子模块,所以它就像一个简单的Git仓库。 它将子模块作为当前版本下的单独文件夹提取,就像在大纲中一样。
  3. cap deploy并享受。
  4. 我写了一篇关于它的博客文章,可以找到更多信息here