从 v2.x.x 升级

1. 更新您的 Gemfile:gem 'capistrano', '~> 3.0', require: false, group: :development

如果您部署 Rails,您还需要 capistrano-railscapistrano-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.rbconfig/deploy/staging.rb。如果您只需要一个阶段,请删除这些文件并声明阶段(例如 production)和 config/deploy.rb 中的服务器。

4. 更新 config/deploy/production.rbconfig/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_urldefault_environment 选项已重命名为 default_env

注意,一些参数不再需要:use_sudonormalize_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 可能可以工作,但可能无法正常工作。

Fork me on GitHub