如果我理解正确,使用capistrano v3的标准git deploy实现会在所有角色上部署相同的存储库。我有一个更难的应用程序,它有几种类型的服务器,每种类型都有自己的代码库和自己的存储库。例如,我的数据库服务器不需要部署任何代码。
我如何在capistrano v3中解决这个问题?
我应该为每个角色编写自己的部署任务吗?
答案 0 :(得分:0)
我如何在capistrano v3中解决这个问题?
所有服务器都获取代码,因为在某些环境中,执行某些操作需要代码。例如,在典型设置中,web
服务器需要您的静态资产,app
服务器需要您的代码来为应用程序提供服务,db
服务器需要您的代码才能运行迁移。
如果在您的环境中不是这样,并且您不希望某些角色的服务器上的代码,您可以轻松发送拉取请求以将no_release
功能从Cap2添加回Cap3。
您当然可以将.rake
文件从Gem中取出,并将其加载到Capfile中,这是使用该工具的完全有效的方法,并根据您自己的需要进行修改。
一般方法是,如果您不需要数据库服务器上的代码,例如,为什么它会在您的部署文件中列出?
答案 1 :(得分:0)
我可以确认您可以使用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/