从 v2.x.x 升级
1. 更新您的 Gemfile:gem 'capistrano', '~> 3.0', require: false, group: :development
如果您部署 Rails,您还需要 capistrano-rails
和 capistrano-bundler
gem(Rails 和 Bundler 集成已从 Capistrano 3 中移出)。
group :development do
gem 'capistrano-rails', '~> 1.1', require: false
gem 'capistrano-bundler', '~> 1.1', require: false
end
您可以为您的首选 ruby 版本管理器添加惯用支持:rvm、rbenv、chruby。
group :development do
gem 'capistrano-rvm', '~> 0.1', require: false
gem 'capistrano-rbenv', '~> 2.0', require: false
gem 'capistrano-chruby', github: 'capistrano/chruby', require: false
end
2. 我们建议从头开始对项目进行 capify,然后将定义从旧配置移动到新配置。
mkdir old_cap
mv Capfile old_cap
mv config/deploy.rb old_cap
mv config/deploy/ old_cap # --> only for multistage setups
现在是 capify 的时候了
cap install
3. Capistrano 3 默认情况下是多阶段的,因此您在 capify 后将拥有 config/deploy/production.rb
和 config/deploy/staging.rb
。如果您只需要一个阶段,请删除这些文件并声明阶段(例如 production
)和 config/deploy.rb
中的服务器。
4. 更新 config/deploy/production.rb
和 config/deploy/staging.rb
以包含相关数据。您可能还想从旧配置 (old_cap/deploy/
) 中添加更多阶段。
5. 如果你之前设置了网关服务器,使用 set :gateway, "www.capify.org"
,你应该升级到
require 'net/ssh/proxy/command'
set :ssh_options, proxy: Net::SSH::Proxy::Command.new('ssh mygateway.com -W %h:%p')
或者使用每个服务器的 ssh_options
等效配置。
6. 现在你需要重构你的旧 deploy.rb
文件(也包括 Capfile
,但在大多数情况下,开发者在 Capistrano 2.x 中没有更改它)。将参数(例如 set :deploy_to, "/home/deploy/#{application}"
或 set :keep_releases, 4
)移动到 config/deploy.rb
,并将任务移动到 Capfile
。
重要提示:repository
选项已重命名为 repo_url
;default_environment
选项已重命名为 default_env
。
注意,一些参数不再需要:use_sudo
、normalize_asset_timestamps
。
7. 如果你之前没有使用 deploy_to
并且部署到 /u/apps/your_app_name
,你需要进行一项额外的更改。现在默认的部署路径是 /var/www/app_name
,升级后你的配置将失效。只需声明自定义的 deploy_to
选项
set :deploy_to, "/u/apps/#{fetch(:application)}"
但提前说一下,/u/apps
不是存储应用程序的最佳位置,我们建议你稍后更改它。
8. 继续编辑 Capfile 并取消注释你需要的插件,例如 rbenv/rvm、bundler 或 rails。
require 'capistrano/rails'
require 'capistrano/bundler'
require 'capistrano/rbenv'
9. 太棒了!尝试使用你的新配置进行部署。如果你在升级指南中发现任何缺少的信息,欢迎你为其做出贡献。
一般建议
使用 DSL 而不是编写 ENV 变量
而不是
run <<-CMD.compact
cd -- #{latest_release} &&
RAILS_ENV=#{rails_env.to_s.shellescape} #{asset_env} #{rake} assets:precompile
CMD
最好使用
on roles :all do
within fetch(:latest_release_directory) do
with rails_env: fetch(:rails_env) do
execute :rake, 'assets:precompile'
end
end
end
注意:‘within’ 块需要包装在 ‘on’ 块中,以便 dsl 能够识别它
每个调用中只能有一个 ‘with’ 块。如果你需要多个 env 设置,请使用 ‘with’ 块参数中的语法,例如(传递一个映射)
on roles :all do
within fetch(:latest_release_directory) do
with rails_env: fetch(:rails_env), rails_relative_url_root: '/home' do
execute :rake, 'assets:precompile', env: {rails_env: fetch(:rails_env), rails_relative_url_root: ''}
end
end
end
2.x 和 3 之间的显著差异
清理
Capistrano 3 现在在标准部署工作流程中运行 deploy:cleanup
任务,并默认保留 5 个版本。以前,这需要你手动添加,如果需要。要更改保留的版本数量,请设置 keep_releases
配置变量
set :keep_releases, 10
POSIX Shell
Capistrano 3 需要像 Bash 或 Sh 这样的 POSIX shell。像 tcsh、csh 这样的 shell 可能可以工作,但可能无法正常工作。