从不同的应用程序执行 capistrano

Executing capistrano from a different application

我需要从现有 ruby 脚本中触发 capistrano 部署。

例如,假设我想启动将监听一些消息的服务,并且在某些消息上我想使用 cap staging deploy 触发另一个应用程序的 capistrano 部署(如果我 运行 这个命令直接来自 shell)。

~/app-to-deploy
  - Gemfile       #including many dependencies
  - config/deploy # capistrano files
~/my-service
  - Gemfile       # including different dependencies than `app-to-deploy`
  - my_script.rb  # that wishes to call `cap app-to-deploy deploy`

我想我可以 运行 我的服务中的 capistrano bash 脚本使用

# my_service.rb
Dir.chdir(ENV['HOME'] + '/app-to-deploy') do
  result = system('bash', '-c', "cap staging deploy")
end

如果我 运行 它有或没有 bundle exec 这给出类似

cap aborted!
LoadError: cannot load such file -- active_support/all
/deploy/hermes/Capfile:2:in `require'
/deploy/hermes/Capfile:2:in `<top (required)>'
(See full trace by running task with --trace)

(我的 app-to-deploy 中有作为 gem 的 ActiveSupport,但 my-service 的 Gemfile 中没有它)

好像我有一个 lib 依赖问题,但我不确定如何解决它...

任何人都有解决问题的想法或方法吗? (或者更好的方法是在不使用 bash 的情况下调用 capistrano,假设我可能仍然有不同的依赖关系?)

(请注意,app-to-deploy 是一个实际的 Rails 应用程序,其中包含许多我不想接触的 Capistrano 脚本...)

问题是在unix系统环境下是继承的。因此,当您从 rails 应用程序调用 Capistrano 时,您无权访问其他 gem。 bash -c 似乎没有清理环境。你可以用 su -l 可能。

一种解决方案是使用

Bundler.with_clean_env do
  Dir.chdir(ENV['HOME'] + '/app-to-deploy') do      
    result = system('bundle', 'exec', "cap", "staging", "deploy")
  end
end

仅供参考:http://bundler.io/man/bundle-exec.1.html#Shelling-out