Capistrano 3:处理不同部署流程的方式

Capistrano 3: way to handle different deploy flows

我是 Capistrano 的新手,但我已经成功地让它为自定义部署工作。我必须将 Moodle 部署到 AWS 中具有自动扩展组和一个或多个静态服务器的集群。

效果很好!我已经设法通过自定义任务改变流程,以便毫无问题地维护我的网站并清除缓存:

namespace :moodle do

  desc 'Save config.php from current release directory'   task :'save-config'
    on roles(:web) do
      execute :sudo, :cp, shared_path.join('config.php'), release_path
      execute :sudo, :chown, 'www-data-aulatp:www-data', release_path.join('config.php') 
    end
  end

  desc 'Copy config.php to release directory'   task :'restore-config' do
    on roles(:web) do
      execute :sudo, :cp, shared_path.join('config.php'), release_path
      execute :sudo, :chown, 'www-data-aulatp:www-data', release_path.join('config.php') 
    end
  end

  desc 'Enable maintenance mode on Moodle site'   task :'enable-maintenance' do
    on roles(:admin) do
      execute :sudo, '-u', 'www-data-aulatp', '/usr/bin/php7.0', current_path.join('admin', 'cli', 'maintenance.php'), '--enable'
    end
  end

  desc 'Disable maintenance mode on Moodle site'   task :'disable-maintenance' do
    on roles(:admin) do
      execute :sudo, '-u', 'www-data-aulatp', '/usr/bin/php7.0', current_path.join('admin', 'cli', 'maintenance.php'), '--disable'
    end
  end

  desc 'Purge all internal Moodle caches'   task :'purge-caches' do
    on roles(:admin) do
      execute :sudo, '-u', 'www-data-aulatp', '/usr/bin/php7.0', current_path.join('admin', 'cli', 'purge_caches.php')
    end   
  end
end

before   'deploy:starting',    'moodle:save-config'
before   'deploy:updated',     'moodle:enable-maintenance' 
after    'deploy:updated',     'moodle:restore-config' 
after    'deploy:finished',    'moodle:enable-maintenance' 
after    'deploy:finished',    'moodle:disable-maintenance' 
after    'deploy:finished',    'moodle:purge-caches'

问题是,有时我需要进行快速部署,一个不需要启用和禁用维护模式或清除缓存的小补丁。

capistrano 可行吗?

作为一个可能的替代方案,我也一直在寻找 capistrano-patch,一种无需创建完整部署过程即可将简单补丁部署到每台服务器的方法。看起来它已经好几年没有更新了,我想它不能与 capistrano 3 一起使用。有没有类似的想法可以用 Capistrano 3 做 HOTFIX?

您可以使用环境变量来声明需要绕过某些内容。例如,您可以 运行 使用 NO_CACHE_PURGE=true cap production deploy 进行部署,然后用类似以下内容包装相关代码:

desc 'Purge all internal Moodle caches'
task :'purge-caches' do
  if ENV['NO_CACHE_PURGE'].nil?
    on roles(:admin) do
      execute :sudo, '-u', 'www-data-aulatp', '/usr/bin/php7.0', current_path.join('admin', 'cli', 'purge_caches.php')
    end
  else
    puts 'Skipping purge-caches due to env variable'
  end
end

如果您很了解 Ruby,并且想自动执行此操作,您可能可以编写一个方法来简化其中的一些操作(以下代码未经测试):

def disableable_task(*args)
  if ENV[args[:env_name]].nil?
    task(args)
  else
    puts "Skipping #{args[0]} due to #{args[:env_name]} environment variable being set"
end

desc 'Purge all internal Moodle caches'
disableable_task :'purge-caches', env_name: 'NO_CACHE_PURGE' do
  on roles(:admin) do
    execute :sudo, '-u', 'www-data-aulatp', '/usr/bin/php7.0', current_path.join('admin', 'cli', 'purge_caches.php')
  end
end