2

我正在尝试编写一个自定义 capistrano 任务,该任务在本地编译我的资产,然后使用 rsync 将它们推送到生产服务器。问题是我无法弄清楚在使用 capistrano 时如何访问我的应用服务器的 IP 地址run_locally

这是我的摘录config/deploy.rb

server "[some_ip_address]", :web, :app, :db, :primary => true

...

namespace :assets do
  desc 'Run the precompile task locally and rsync with shared'
  task :precompile, :roles => :web, :except => { :no_release => true } do

    run_locally "bundle exec rake assets:precompile"
    run_locally "rsync -zvrh --progress -e 'ssh -i #{ssh_options[:keys][0]}' public/assets #{user}@$CAPISTRANO:HOST$:#{shared_path}"
    puts "cleaning up locally compiled assets"
    run_locally "bundle exec rake assets:clean"
  end
end

问题是$CAPISTRANO:HOST$没有扩展到ip。我知道我可以对其进行硬编码,但我想正确地做到这一点。

4

4 回答 4

2

尝试使用主机 IP 定义 capistrano 变量并在 capistrano 脚本中的任何位置引用它以保持它们干燥:

set :host, "some IP addresss"
server host, :web, :app, :db, :primary => true

并在您的任务定义中:

run_locally "... #{host} ..."
于 2012-07-17T07:41:23.447 回答
0

不幸的是,run_locally没有与 相同的字符串替换run,因此$CAPISTRANO:HOST$不起作用。

如果您要做的只是对资产进行预编译,则可以将以下行放入您的deploy.rb:

load 'deploy/assets'
于 2012-07-17T07:47:49.713 回答
0

您是否尝试过getaddrinfoSocketAddrinfo中使用?

1.9.3p125 :035 > Addrinfo::getaddrinfo('ya.ru', 'http', :INET, :STREAM)[0].ip_address
 => "93.158.134.203"
1.9.3p125 :037 > Socket::getaddrinfo('ya.ru', 'http', :INET, :STREAM)[0][3]
 => "93.158.134.3"
于 2012-07-17T07:51:06.550 回答
0

使用 pry gem 我发现了这样一个选项:

  run_locally %{bundle exec rake assets:precompile}
  roles[:web].servers.each do |web_server|
    run_locally %{rsync --recursive --times --rsh=ssh --compress --human-readable --progress public/assets #{user}@#{web_server.host}:#{shared_path}}
  end
  run_locally %{bundle exec rake assets:clean}

PS。我试图做同样的事情并发现了这个问题:)

另一种选择是看 turbo-sprockets-rails3 gem。

于 2013-04-07T21:54:06.247 回答