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
我是 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