Ruby 从gem根文件夹安装gem后运行命令

Ruby 从gem根文件夹安装gem后运行命令,ruby,deployment,gem,chef-infra,Ruby,Deployment,Gem,Chef Infra,我正在部署一个Sinatra应用程序作为gem。我有一个命令将应用程序作为服务启动。 我们正在使用chef管理我们的部署 如何运行命令来启动应用程序服务,但只能在应用程序服务完全安装(包括运行时依赖项)之后 我曾尝试在谷歌上运行一个安装后脚本,但如果没有复杂的“extconf.rb”解决方案,我还没有发现任何有用或具体的东西 如果可以的话,我宁愿不使用execute资源 编辑:我尝试了建议的方法,但它破坏了一些东西,导致berkshelf无法在我们的管道中工作 以下是我使用的代码: execut

我正在部署一个Sinatra应用程序作为gem。我有一个命令将应用程序作为服务启动。 我们正在使用chef管理我们的部署

如何运行命令来启动应用程序服务,但只能在应用程序服务完全安装(包括运行时依赖项)之后

我曾尝试在谷歌上运行一个安装后脚本,但如果没有复杂的“extconf.rb”解决方案,我还没有发现任何有用或具体的东西

如果可以的话,我宁愿不使用execute资源

编辑:我尝试了建议的方法,但它破坏了一些东西,导致berkshelf无法在我们的管道中工作

以下是我使用的代码:

execute "run-service:post_install" do
    cwd  (f = File.expand_path(__FILE__).split('/')).shift(f.length - 3).join('\\')
    timeout 5
    command "bundle && rake service:post_install"
    # action :nothing
    # subscribes :run, "gem_package[gem_name]" , :delayed
end
不管我是否对最后两行发表评论,它只是破坏了一些东西,但如果我把整个东西拿出来,它就不再破坏东西了。显然我做错了什么,但我不知道是什么

编辑: 是命令本身破坏了它,当我将命令更改为
ls
action
更改为
:run
时,它会破坏


编辑:在更改了一点命令路径后,我设法让它吐出一个可用的错误,它试图从chef cook books路径运行命令,所以我(希望)强制它使用正确的路径。

为什么不想使用执行资源?这正是它的目的,运行厨师的命令。Chef遵循资源的顺序,因此如果您有一个
gem_包
,然后是一个
execute
,它们将按该顺序运行。

因此,最后我决定尝试使用服务资源,因为它允许您设置start和stop命令

我使用的代码是:

service service_name do
  init_command ("#{%x(gem env gemdir).strip.gsub('/','\\')}\\gems\\gem_name-#{installing_version}")
  start_command "rake service:start"
  stop_command "rake service:stop"
  reload_command "rake service:reload"
  restart_command "rake service:restart"
  supports start: true, restart: true, reload: true
  action [:enable,:start]
end 

我仍然有问题,但这是另一种类型。

因为它需要是幂等的,而execute不是真正的幂等的,除非你使用
if
检查,我不知道为什么,但是关于它的一些东西让我不喜欢它,因为它。是的,我知道,这不是很合乎逻辑,但必须有一种更独立的方法(比如应用程序在安装后自行运行,而不是从外部运行)。如果您只想在gem的状态发生变化(如从未安装到已安装)时运行命令,则可以使用gem_包资源的通知。