2012-10-06 17 views
5

Estoy desarrollando un libro de cocina para implementar un blog sencillo basado en jekyll. Utilizo el libro de cocina 'aplicación' como base. Todo funciona sin problemas, excepto que el chef simplemente ignora mis devoluciones de llamada definidas.¿Cómo se define la devolución de llamada before_symlink usando el libro de recetas de la aplicación?

El registro del Chef contiene entradas sobre mi devolución de llamada, pero no veo errores ni resultados de la ejecución de la devolución de llamada.

Aquí es archivo de recetas/default.rb:

include_recipe "git" 

application "example_com" do 
    path "/var/www/example.com" 
    repository "[email protected]:xxx/xxx.git" 
    revision "master" 

    deploy_key <<EOF 
-----BEGIN RSA PRIVATE KEY----- 
..skip... 
-----END RSA PRIVATE KEY----- 
EOF 

    # before_symlink "script/bootstrap" 

    before_deploy do 
    # raise 
    # Chef::Log.info("INSANE!") 
    execute "bundle exec rake generate" do 
     cwd release_path 
    end 
    end 
end 

Aquí es el registro donde el chef-cliente dice que ejecuta before_deploy devolución de llamada:

[2012-10-06T10:06:20-04:00] INFO: Processing ruby_block[example_com before_deploy] action create (/var/cache/chef/cookbooks/application/providers/default.rb line 107) 
[2012-10-06T10:06:20-04:00] DEBUG: Got callback before_deploy: #<Proc:[email protected]/var/cache/chef/cookbooks/example_com/recipes/default.rb:24> 
[2012-10-06T10:06:20-04:00] INFO: application[example_com] running callback before_deploy 
[2012-10-06T10:06:20-04:00] INFO: ruby_block[example_com before_deploy] called 
[2012-10-06T10:06:20-04:00] INFO: Processing deploy_revision[example_com] action deploy (/var/cache/chef/cookbooks/application/providers/default.rb line 122) 

También probé devolución de llamada para definir el uso de cuerdas, Pero el resultado es el mismo. Chef muestra un error cuando no hay un archivo con la definición de devolución de llamada y simplemente ignora el archivo si está en el lugar correcto.

Actualización 1

Después de cavar más profundo dentro de las fuentes del cocinero me di cuenta que las devoluciones de llamada se ejecutan en el corredor cocinero independiente y esto no ocurre instantáneamente. Cuando el código en el libro de recetas de la aplicación llama a _recipe_eval_ para evaluar el cuerpo de devolución de llamada Chef crea un corredor independiente y el código no se ejecuta hasta que algo llame al converja al método.

Así que modifiqué un poco el libro de recetas. Agregué la llamada converge justo después de _recipe_eval_ y todo comenzó a funcionar.

Creo que esto es un error y voy a crear un problema en el rastreador oficial de Opscode. Sin embargo, cualquier comentario es bienvenido!

Aquí se Modifed versión de la aplicación/bibliotecas/default.rb:

class Chef 
    class Provider 
    module ApplicationBase 

    # ...skip... 

     def callback(what, callback_code=nil) 
     Chef::Log.debug("Got callback #{what}: #{callback_code.inspect}") 
     @collection = Chef::ResourceCollection.new 
     case callback_code 
     when Proc 
      Chef::Log.info "#{@new_resource} running callback #{what}" 
      # recipe_eval(&callback_code) 
      recipe_eval(&callback_code) 
      converge # <--- Remove this line and no callbacks will work. 
     when String 
      callback_file = "#{release_path}/#{callback_code}" 
      unless ::File.exist?(callback_file) 
      raise RuntimeError, "Can't find your callback file #{callback_file}" 
      end 
      run_callback_from_file(callback_file) 
     when nil 
      nil 
     else 
      raise RuntimeError, "You gave me a callback I don't know what to do with: #{callback_code.inspect}" 
     end 
     end 
    end 
    end 
end 

Respuesta

Cuestiones relacionadas