2

如果我理解正确,使用 capistrano v3 的标准 git deploy 实现会在所有角色上部署相同的存储库。我有一个更难的应用程序,它有几种类型的服务器,每种类型都有自己的代码库和自己的存储库。例如,我的数据库服务器不需要部署任何代码。

如何在 capistrano v3 中解决这样的问题?

我应该为每个角色编写自己的部署任务吗?

4

2 回答 2

0

如何在 capistrano v3 中解决这样的问题?

所有服务器都获取代码,因为在某些环境中需要代码来执行某些操作。例如,在典型设置中,web服务器需要您的静态资产,app服务器需要您的代码来服务应用程序,db服务器需要您的代码来运行迁移。

如果在您的环境中不是这样,并且您不希望服务器上的代码具有某些角色,您可以轻松发送拉取请求以将no_release功能从 Cap2 添加回 Cap3。

您当然可以将.rake文件从 Gem 中取出,然后将它们加载到 Capfile 中,这是使用该工具的一种完全有效的方式,并可以根据自己的需要对其进行修改。

一般的方法是,如果您不需要数据库服务器上的代码,例如,为什么它会在您的部署文件中列出?

于 2013-10-18T07:54:17.590 回答
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/

于 2018-08-03T11:19:11.607 回答