2012-03-25 31 views
1

我想部署一个PHP网站使用Capistrano。该网站由4个组件(前端代码和3个Web服务)组成,每个组件都存储在它自己的git存储库中。我想将所有4个组件部署到一个树形结构中(见下文),因此网站版本之间的切换将与移动“当前”链接一样简单。将多个应用程序部署到与Capistrano和Git的单一树

我看到,默认情况下,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脚本来为我节省每次部署时更新子模块的麻烦(一个非常繁琐的过程!)。部署我运行脚本(源代码下面),然后运行“帽部署”。

#!/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 
+0

有一种新的方法。请参阅此答案http://stackoverflow.com/a/40921589/2067375。 (免责声明:我是宝石的拥有者) – 2016-12-01 22:38:47

回答

2

我在部署rails应用程序和一个webservice时遇到了非常类似的问题。我决定使用git submodules,它应该可以解决你所有的问题。

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

然后,您可以分别开发所有4个组件,并且当您要部署时只更新子模块以更正点并提交主存储库。这种方法应该正好给出这个目录布局,并且应该使其易于回滚。

1

我试图使用Capistrano v3.6对3个独立的Git存储库进行网络应用程序的原子部署时,遇到同样的问题。

我使用子模块的方法,因为你讨论,但在一个更自动化的方式和v3(看帖子的日期,它可能是v2)。

步骤

  1. 有1个回购的上限配置和另一1分组主项目回购的子模块。
    set :repository, 'submodules-repo-url'
  2. 替换Cap的Git策略以支持子模块(v2支持,在v3中放弃)。
    Find script here
    set :git_strategy, SubmoduleStrategy
    上述策略负责更新子模块,因此它就像一个简单的Git回购。
    它将当前版本下的子模块作为单独的文件夹提取,就像在大纲中一样。
  3. cap deploy并享受。

我写了一篇关于它的博客文章,更多的信息可以发现here

相关问题