【问题标题】:Executing capistrano from a different application从不同的应用程序执行 capistrano
【发布时间】:2018-03-14 17:00:25
【问题描述】:

我需要从现有的 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 中有 ActiveSupport 作为 gem,但 my-service 的 Gemfile 中没有它)

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

有人有解决问题的想法或方法吗? (或者甚至更好的方法来调用 capistrano 而不使用 bash,假设我可能仍然有不同的依赖项?)

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

【问题讨论】:

    标签: ruby-on-rails ruby bash capistrano capistrano3


    【解决方案1】:

    问题是在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

    【讨论】:

    • 感谢Bundler.with_clean_env 就像一个魅力。没有尝试过su -l,但我不确定这是否适用于 rvm
    • 它应该尝试使用 Bundler.with_clean_env 和不使用 env 打印。它不会取消设置所有变量,在某些情况下您可能不希望这样做。但是在很多情况下它都有效
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多