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

Capistrano deployment of 2 apps at the same time without downtime

我有一个共享库,顾名思义,就是一个在不同项目之间共享的项目,以避免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

execute 的问题是 app1 在更新共享和部署 app1 时会出现停机。

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

虽然不同的人会有不同的回答,但我认为 "best practice" 我会推荐的是让每个项目在其部署中包含共享库。除非代码很大或者确实必须串联部署(例如更改共享配置),否则这通常没有什么缺点。如果你正在使用 PHP,你可以为此使用 Composer。使用 Ruby,捆绑器。这两个都可以指向 Git 端点。

这就是 Gems 在 Capistrano 中的工作方式,Capistrano::Bundler 将该应用程序的所有 gems 的唯一的每个应用程序副本复制到 shared/bundler

编辑:

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

  1. composer.json 文件添加到您的库(这将使它 easier/possible 执行 PSR-4 自动加载)。此处说明:https://getcomposer.org/doc/05-repositories.md#using-private-repositories
  2. 让 Composer 盲目地拉入您的库,只是将其粘贴在 vendor/ 中。此处说明:https://getcomposer.org/doc/05-repositories.md#package-2

如果您有关于 Composer 用法的具体问题,我建议您 post 提出一个新问题。其他比我更熟悉 Composer 的人可能会帮助你。我不像其他工具那样经常使用 Composer。