我有一个共享库,正如其名称所示,是一个在不同项目之间共享的项目,以避免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的流程,只在任务结束时执行符号链接?
答案 0 :(得分:1)
虽然不同的人会有不同的回答,但我认为最佳实践"我建议让每个项目在其部署中包含共享库。除非代码很大或者确实必须串联部署(例如更改共享配置),否则通常会有很少的缺点。如果您使用的是PHP,则可以使用Composer。使用Ruby,Bundler。这两个都可以指向Git端点。
这就是Gems在Capistrano工作的方式,Capistrano::Bundler
将所有应用程序宝石的独特应用副本复制到shared/bundler
。
编辑:
要从Git存储库添加Composer共享库,您有两个主要选项:
composer.json
文件添加到您的库中(这样可以更容易/可以进行PSR-4自动加载)。说明:https://getcomposer.org/doc/05-repositories.md#using-private-repositories vendor/
中。说明:https://getcomposer.org/doc/05-repositories.md#package-2 如果您对Composer的使用有特定问题,我建议您发布一个新问题。其他比我更熟悉Composer的人可能会帮助你。我几乎不像其他工具那样使用Composer。