如果我理解正确,使用 capistrano v3 的标准 git deploy 实现会在所有角色上部署相同的存储库。我有一个更难的应用程序,它有几种类型的服务器,每种类型都有自己的代码库和自己的存储库。例如,我的数据库服务器不需要部署任何代码。
如何在 capistrano v3 中解决这样的问题?
我应该为每个角色编写自己的部署任务吗?
如果我理解正确,使用 capistrano v3 的标准 git deploy 实现会在所有角色上部署相同的存储库。我有一个更难的应用程序,它有几种类型的服务器,每种类型都有自己的代码库和自己的存储库。例如,我的数据库服务器不需要部署任何代码。
如何在 capistrano v3 中解决这样的问题?
我应该为每个角色编写自己的部署任务吗?
如何在 capistrano v3 中解决这样的问题?
所有服务器都获取代码,因为在某些环境中需要代码来执行某些操作。例如,在典型设置中,web
服务器需要您的静态资产,app
服务器需要您的代码来服务应用程序,db
服务器需要您的代码来运行迁移。
如果在您的环境中不是这样,并且您不希望服务器上的代码具有某些角色,您可以轻松发送拉取请求以将no_release
功能从 Cap2 添加回 Cap3。
您当然可以将.rake
文件从 Gem 中取出,然后将它们加载到 Capfile 中,这是使用该工具的一种完全有效的方式,并可以根据自己的需要对其进行修改。
一般的方法是,如果您不需要数据库服务器上的代码,例如,为什么它会在您的部署文件中列出?
我可以确认您可以使用no_release: true
来禁止服务器部署存储库代码。
我需要这样做,以便我可以专门为不同的服务器运行重新启动任务。
一定要给你的服务器一个角色,这样你就可以定位它。有一个方便的函数,release_roles()
您可以使用它来定位具有您的存储库代码的服务器。
然后,您可以将任何任务(例如我的重新启动)分离为独立于部署过程。
例如:
server '10.10.10.10', port: 22, user: 'deploy', roles: %w{web app db assets}
server '10.10.10.20', port: 22, user: 'deploy', roles: %w{frontend}, no_release: true
namespace :nginx do
desc 'Reloading PHP will clear OpCache. Remove Nginx Cache files to force regeneration.'
task :reload do
on roles(:frontend) do
execute "sudo /usr/sbin/service php7.1-fpm reload"
execute "sudo /usr/bin/find /var/run/nginx-cache -type f -delete"
end
end
end
after 'deploy:finished', 'nginx:reload'
after 'deploy:rollback', 'nginx:reload'
# Example of a task for release_roles() only
desc 'Update composer'
task :update do
on release_roles(:all) do
execute "cd #{release_path} && composer update"
end
end
before 'deploy:publishing', 'composer:update'
我可以想到很多这样的场景会派上用场。
仅供参考,此链接有更多有用的示例: https ://capistranorb.com/documentation/advanced-features/property-filtering/