Chef 部署期间 'release_path' 上的 NoMethodError

NoMethodError on 'release_path' during chef deployment

我对 Chef 部署还很陌生,我正在尝试使用 OpsWorks 部署 rails 应用程序。问题在于资产预编译。

我有这个方法来执行预编译:

execute "rake assets:precompile" do   
  cwd release_path
  command "bundle exec rake assets:precompile --trace"    
  environment "RAILS_ENV" => "production"
end

当我使用 Chef 部署时,出现以下错误:

ERROR: undefined method `release_path' for Chef::Resource::Execute

奇怪的是,我能找到的每个示例食谱都使用了 release_path 助手。怎么不能在这里定义呢?

以下是我在 opsworks 上对 rails 应用程序进行预编译的方法:

此代码位于您的应用程序部署文件夹中,在 /approot/deploy/before_migrate.rb 中名为 "before_migrate.rb" 的文件中。

在opsworks中定义的应用程序中创建环境变量。

rails_env = new_resource.environment["RAILS_ENV"]
secret_key_base = new_resource.environment["SECRET_KEY_BASE"]
devise_secret_key = new_resource.environment["DEVISE_SECRET_KEY"]

Chef::Log.info("Precompiling assets for RAILS_ENV=#{rails_env}...")
Chef::Log.info("SECRET_KEY_BASE=#{secret_key_base}, DEVISE_SECRET_KEY=#{devise_secret_key}")

execute "rake assets:precompile" do
  cwd release_path
  command "RAILS_ENV=#{rails_env} bundle exec rake assets:precompile"

  environment "RAILS_ENV" => rails_env
  environment "SECRET_KEY_BASE" => secret_key_base
  environment "DEVISE_SECRET_KEY" => devise_secret_key
end

我使用 node[:deploy]['appshortname'][:deploy_to] 解决了这个问题。我的完整食谱如下:

node[:deploy].each do |application, deploy|
  execute "rake assets:precompile" do   
    cwd "#{deploy[:deploy_to]}/current"
    command "bundle exec rake assets:precompile --trace"

    environment deploy[:environment_variables].merge(
      "RAILS_ENV" => deploy[:rails_env]
    )
  end
end