Capistrano Multistage部署到错误的目录
最近更新我的宝石后,我的capistrano设置出现了一些问题。我有一个生产和分段设置的多级设置。Capistrano Multistage部署到错误的目录
/config/deploy.rb
# setup multistage
set :stages, %w(testing production)
set :default_stage, "testing"
require 'capistrano/ext/multistage'
/config/deploy/production.rb
# Set deploy path
set :deploy_to, "/var/www/mysite/live"
set :rails_env, "production"
/config/deploy/testing.rb
# Set deploy path
set :deploy_to, "/var/www/mysite/test"
set :rails_env, "test"
问题是,它似乎忽略我的deploy_to设置。它只是部署到默认的/ u/apps/mysite。
我不知道它是否有任何相关性,所有这一切的原因是从apache +乘客转移到nginx +独角兽。但我认为它与此无关,因为这只是结帐过程。
我最终通过添加以下到我的部署/ production.rb和testing.rb解决了这个
set(:deploy_to) { "/var/www/#{application}/live" }
set(:releases_path) { File.join(deploy_to, version_dir) }
set(:shared_path) { File.join(deploy_to, shared_dir) }
set(:current_path) { File.join(deploy_to, current_dir) }
set(:release_path) { File.join(releases_path, release_name) }
我在堆栈溢出时偶然发现了这个问题。这是一个古老的问题,但自从它被宣布为开放以来,我会给它一个机会。
我认为这可能是Capistrano实例如何加载的范围问题。
我注意到这句法不会在production.rb和test.rb文件
set :deploy_to, "/var/www/mysite/live"
工作,但这个作用:
set(:deploy_to) { "/var/www/#{application}/live" }
其细微的差别,但我觉得一个该工作实际上是将该信息作为Proc块传递,而第一个将该信息作为字符串传递。我有一个鬼鬼祟祟的怀疑,即在Capistrano实例出现时,该串不再存在。
这会告诉我,您的加载或需要订单中的某些内容已关闭,因为您应该能够在这些文件中设置部署变量。如果你不能弄清楚,你可能能够欺骗与
Capistrano::Configuration.instance.load do
# variables, etc here
end
环绕部署/ production.rb或部署/ test.rb代码,肯定会告诉你,这文件未在Capistrano实例的范围内加载。
还未成年点,但这些文件应该在
config/deploy # relative to your Rails app
不
/config/deploy/ # this is an absolute path off of your root folder
好运。希望你已经解决了这个问题!
set(:deploy_to){“/ var/www /#{application}/live”}'不适用于capistrano 3.x的我得到以下消息'参数的错误数量(1为2)' – czerasz
第3章是一个完整的API重写IIRC,他们试图清理遗留代码库。该语法将在2中解决工作,但是...... :) – engineerDave
可能只是您的订单deploy.rb?把上面要求的舞台布景
require 'capistrano/ext/multistage'
# setup multistage
set :stages, %w(testing production)
set :default_stage, "testing"
正如在多级扩展的官方[wiki页面](https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension)中所述,'require' **必须**在两个'set'之后。 – asymmetric
必须有一个办法做到这一点,而无需复制每个阶段的配置。想法? – thekingoftruth
用解决方案回答你的问题,并接受它,所以它会显示为已回答。 – mrbrdo