2012-10-06 4 views
5

Sto sviluppando un libro di cucina per distribuire un semplice blog basato su jekyll. Uso il ricettario "applicazione" come base. Tutto funziona senza intoppi tranne che lo chef ignora semplicemente i miei callback definiti.Come definire il callback before_symlink utilizzando il ricettario dell'applicazione?

Il registro dello chef contiene voci sulla mia richiamata, ma non vedo errori o esiti dell'esecuzione di callback.

Ecco file di ricette/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 

Ecco il registro dove lo chef-cliente dice esegue before_deploy callback:

[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) 

Ho anche cercato di definire richiamata tramite stringa, ma il risultato è lo stesso. Lo chef mostra un errore quando non ci sono file con la definizione di callback e semplicemente ignora il file se è nel posto giusto.

Update 1

Dopo aver scavato più in profondità le fonti Chef mi sono reso conto che le richiamate vengono eseguite in corridore cuoco separato e questo non avviene istantaneamente. Quando il codice nel libro di cucina applicazione chiama _recipe_eval_ per valutare callback Chef corpo crea corridore separata e il codice non eseguito fino a quando qualcosa chiamata convergono metodo.

Così, ho modificato l'applicazione libro di cucina un po '. Ho aggiunto la chiamata converge subito dopo _recipe_eval_ e tutto ha iniziato a funzionare.

Penso che questo sia un bug e sto per creare un problema nel tracker Opscode ufficiale. Tuttavia, qualsiasi commento è molto gradito!

Qui è modifed versione dell'applicazione/librerie/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 

risposta