Capistrano同时部署2个应用程序,无需停机

时间:2016-03-21 10:18:07

标签: capistrano capistrano3

我有一个共享库,正如其名称所示,是一个在不同项目之间共享的项目,以避免DRY。共享库是一个GIT存储库以及其他应用程序(app1,app2,app3)。

在部署app1时,我想首先部署shared,然后再部署app1。对于app2和app3也是如此。为了避免任何停机,共享库必须与app1同时部署,因此基本上deploy:symlink:release需要在成功部署结束时发生。

当共享库中的代码发生变化时,我必须确保所有依赖它的项目也同时部署

到目前为止,我已成功设置Capistrano以单独部署每个应用程序。经过一些阅读后,我现在正在使用caphub,但它似乎无助于我解决这个问题。

我目前使用的是:

namespace :app1 do
 task :deploy do
    run_locally do
       execute 'cap apps:shared staging deploy --dry-run', raise_on_non_zero_exit: true
       execute 'cap apps:app1 staging deploy --dry-run', raise_on_non_zero_exit: true
       execute 'cap apps:shared staging deploy', raise_on_non_zero_exit: true
       execute 'cap apps:app1 staging deploy', raise_on_non_zero_exit: true
    end
 end
end

执行问题是,在更新共享并且app1正在部署时,app1将遇到停机时间。

解决此问题的最佳做法是什么?有没有办法覆盖capistrano的流程,只在任务结束时执行符号链接?

1 个答案:

答案 0 :(得分:1)

虽然不同的人会有不同的回答,但我认为最佳实践"我建议让每个项目在其部署中包含共享库。除非代码很大或者确实必须串联部署(例如更改共享配置),否则通常会有很少的缺点。如果您使用的是PHP,则可以使用Composer。使用Ruby,Bundler。这两个都可以指向Git端点。

这就是Gems在Capistrano工作的方式,Capistrano::Bundler将所有应用程序宝石的独特应用副本复制到shared/bundler

编辑:

要从Git存储库添加Composer共享库,您有两个主要选项:

  1. composer.json文件添加到您的库中(这样可以更容易/可以进行PSR-4自动加载)。说明:https://getcomposer.org/doc/05-repositories.md#using-private-repositories
  2. 让Composer盲目地拉进你的图书馆,只需将其粘贴在vendor/中。说明:https://getcomposer.org/doc/05-repositories.md#package-2
  3. 如果您对Composer的使用有特定问题,我建议您发布一个新问题。其他比我更熟悉Composer的人可能会帮助你。我几乎不像其他工具那样使用Composer。