capistrano(v3)在所有角色上部署相同的代码

时间:2013-10-17 22:07:42

标签: capistrano

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

我如何在capistrano v3中解决这个问题?

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

2 个答案:

答案 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/

相关问题