2013-06-11 10 views
13

OpsWorks nie prekompiluje zasobów przy wdrażaniu. Znalazłem ten przepis w this thread, ale myślę, że nie jest on kompletny, lub brakuje czegoś, ponieważ pojawia się błąd dotyczący braku znalezienia release_path.Jak wstępnie skompilować zasoby z szefem kuchni?

precompile.rb:

Chef::Log.info("Running deploy/before_migrate.rb...") 

Chef::Log.info("Symlinking #{release_path}/public/assets to #{new_resource.deploy_to}/shared/assets") 

link "#{release_path}/public/assets" do 
    to "#{new_resource.deploy_to}/shared/assets" 
end 

rails_env = new_resource.environment["RAILS_ENV"] 
Chef::Log.info("Precompiling assets for RAILS_ENV=#{rails_env}...") 

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

kłody:

undefined local variable or method `release_path' for .... 

Jakieś pomysły? W ogóle nie znam szefa kuchni i próbuję to rozgryźć w locie.

+0

Wygląda na to trzeba zapewnić release_path, ścieżkę, w której aplikacja Rails powinny znajdować się na tym hoście deisgnation. – cmur2

+0

Zmienia się to za każdym razem, gdy wdrażasz aplikację. Jest dynamiczny, więc nie mogę go zakodować. – manafire

Odpowiedz

10

Zanim OpsWorks będzie w stanie obsłużyć system potoku, możesz to zrobić. Utwórz plik deploy/before_symlink.rb z następującą treścią w aplikacji szyny.

run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile" 

Jeśli wdrożysz aplikację Rails do innego środowiska, zmień RAILS_ENV.

Jeśli używasz stosu NGINX/Unicorn, musisz zmodyfikować zasób /assets. Po prostu skopiuj następującą zawartość do pliku o nazwie unicorn/templates/default/nginx_unicorn_web_app.erb w książkach kucharskich.

upstream unicorn_<%= @application[:domains].first %> { 
server unix:<%= @application[:deploy_to]%>/shared/sockets/unicorn.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name <%= @application[:domains].join(" ") %> <%= node[:hostname] %>; 
    access_log <%= node[:nginx][:log_dir] %>/<%= @application[:domains].first %>.access.log; 

    keepalive_timeout 5; 

    root <%= @application[:absolute_document_root] %>; 

    <% if @application[:nginx] && @application[:nginx][:client_max_body_size] %> 
    client_max_body_size <%= @application[:nginx][:client_max_body_size] %>; 
    <% end %> 

    location/{ 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    # If you don't find the filename in the static files 
    # Then request it from the unicorn server 
    if (!-f $request_filename) { 
     proxy_pass http://unicorn_<%= @application[:domains].first %>; 
     break; 
    } 
    } 

    location /nginx_status { 
    stub_status on; 
    access_log off; 
    allow 127.0.0.1; 
    deny all; 
    } 

    location ~ ^/assets/ { 
    expires 1y; 
    add_header Cache-Control public; 

    add_header ETag ""; 
    break; 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
    root <%= @application[:absolute_document_root] %>; 
    } 
} 

<% if @application[:ssl_support] %> 
server { 
    listen 443; 
    server_name <%= @application[:domains].join(" ") %> <%= node[:hostname] %>; 
    access_log <%= node[:nginx][:log_dir] %>/<%= @application[:domains].first %>-ssl.access.log; 

    ssl on; 
    ssl_certificate /etc/nginx/ssl/<%= @application[:domains].first %>.crt; 
    ssl_certificate_key /etc/nginx/ssl/<%= @application[:domains].first %>.key; 
    <% if @application[:ssl_certificate_ca] -%> 
    ssl_client_certificate /etc/nginx/ssl/<%= @application[:domains].first %>.ca; 
    <% end -%> 

    keepalive_timeout 5; 

    root <%= @application[:absolute_document_root] %>; 

    <% if @application[:nginx] && @application[:nginx][:client_max_body_size] %> 
    client_max_body_size <%= @application[:nginx][:client_max_body_size] %>; 
    <% end %> 

    location/{ 
    proxy_set_header X-Forwarded-Proto https; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 

    # If you don't find the filename in the static files 
    # Then request it from the unicorn server 
    if (!-f $request_filename) { 
     proxy_pass http://unicorn_<%= @application[:domains].first %>; 
     break; 
    } 
    } 

    location ~ ^/assets/ { 
    expires 1y; 
    add_header Cache-Control public; 

    add_header ETag ""; 
    break; 
    } 

    error_page 500 502 503 504 /500.html; 
    location = /500.html { 
    root <%= @application[:absolute_document_root] %>; 
    } 
} 
<% end %> 

Jeśli używasz stosu Apache2/pasażera, trzeba zmodyfikować zasób /assets. Po prostu skopiuj następującą zawartość do pliku o nazwie passenger_apache2/templates/default/web_app.conf.erb w książkach kucharskich.

<VirtualHost *:80> 
    ServerName <%= @params[:server_name] %> 
    <% if @params[:server_aliases] && [email protected][:server_aliases].empty? -%> 
    ServerAlias <% @params[:server_aliases].each do |a| %><%= "#{a}" %> <% end %> 
    <% end -%> 

    <% if @params[:mounted_at] -%> 
    DocumentRoot /var/www 
    <%= @params[:deploy][:passenger_handler] -%>BaseURI <%= @params[:mounted_at] %> 
    <% else -%> 
    DocumentRoot <%= @params[:docroot] %> 
    <%= @params[:deploy][:passenger_handler] -%>BaseURI/
    <% end -%> 
    <%= @params[:deploy][:passenger_handler] -%>Env <%= @params[:rails_env] %> 

    <Directory <%= @params[:docroot] %>> 
    Options FollowSymLinks 
    AllowOverride None 
    Order allow,deny 
    Allow from all 
    </Directory> 

    <Directory ~ "\.svn"> 
    Order allow,deny 
    Deny from all 
    </Directory> 

    <Directory ~ "\.git"> 
    Order allow,deny 
    Deny from all 
    </Directory> 

    <LocationMatch "^/assets/.*$"> 
    Header unset ETag 
    FileETag None 
    # RFC says only cache for 1 year 
    ExpiresActive On 
    ExpiresDefault "access plus 1 year" 
    </LocationMatch> 

    LogLevel info 
    ErrorLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-error.log 
    CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-access.log combined 
    CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ganglia.log ganglia 

    FileETag none 

    RewriteEngine On 
    Include <%= @params[:rewrite_config] %>* 
    RewriteLog <%= node[:apache][:log_dir] %>/<%= @application_name %>-rewrite.log 
    RewriteLogLevel 0 

    # Canonical host 
    #RewriteCond %{HTTP_HOST} !^<%= @params[:server_name] %> [NC] 
    #RewriteCond %{HTTP_HOST} !^$ 
    #RewriteRule ^/(.*)$  http://<%= @params[:server_name] %>/$1 [L,R=301] 

    RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|jpeg|png)$ 
    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f 
    RewriteCond %{SCRIPT_FILENAME} !maintenance.html 
    RewriteRule ^.*$ /system/maintenance.html [L] 

    Include <%= @params[:local_config] %>* 
</VirtualHost> 

<% if node[:deploy][@application_name][:ssl_support] -%> 
<VirtualHost *:443> 
    ServerName <%= @params[:server_name] %> 
    <% if @params[:server_aliases] && [email protected][:server_aliases].empty? -%> 
    ServerAlias <% @params[:server_aliases].each do |a| %><%= "#{a}" %> <% end %> 
    <% end -%> 

    SSLEngine on 
    SSLProxyEngine on 
    SSLCertificateFile <%= node[:apache][:dir] %>/ssl/<%= @params[:server_name] %>.crt 
    SSLCertificateKeyFile <%= node[:apache][:dir] %>/ssl/<%= @params[:server_name] %>.key 
    <% if @params[:ssl_certificate_ca] -%> 
    SSLCACertificateFile <%= node[:apache][:dir] %>/ssl/<%= @params[:server_name] %>.ca 
    <% end -%> 
    SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0 

    <% if @params[:mounted_at] -%> 
    DocumentRoot /var/www 
    <%= @params[:deploy][:passenger_handler] -%>BaseURI <%= @params[:mounted_at] %> 
    <% else -%> 
    DocumentRoot <%= @params[:docroot] %> 
    <%= @params[:deploy][:passenger_handler] -%>BaseURI/
    <% end -%> 
    <%= @params[:deploy][:passenger_handler] -%>Env <%= @params[:rails_env] %> 

    <Directory <%= @params[:docroot] %>> 
    Options FollowSymLinks 
    AllowOverride All 
    Order allow,deny 
    Allow from all 
    </Directory> 

    <Directory ~ "\.svn"> 
    Order allow,deny 
    Deny from all 
    </Directory> 

    <Directory ~ "\.git"> 
    Order allow,deny 
    Deny from all 
    </Directory> 

    <LocationMatch "^/assets/.*$"> 
    Header unset ETag 
    FileETag None 
    # RFC says only cache for 1 year 
    ExpiresActive On 
    ExpiresDefault "access plus 1 year" 
    </LocationMatch> 

    LogLevel info 
    ErrorLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ssl-error.log 
    CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ssl-access.log combined 
    CustomLog <%= node[:apache][:log_dir] %>/<%= @params[:name] %>-ssl-ganglia.log ganglia 

    FileETag none 

    RewriteEngine On 
    Include <%= @params[:rewrite_config] %>-ssl* 
    RewriteLog <%= node[:apache][:log_dir] %>/<%= @application_name %>-ssl-rewrite.log 
    RewriteLogLevel 0 

    # Canonical host 
    #RewriteCond %{HTTP_HOST} !^<%= @params[:server_name] %> [NC] 
    #RewriteCond %{HTTP_HOST} !^$ 
    #RewriteRule ^/(.*)$  http://<%= @params[:server_name] %>/$1 [L,R=301] 

    RewriteCond %{REQUEST_URI} !\.(css|gif|jpg|jpeg|png)$ 
    RewriteCond %{DOCUMENT_ROOT}/system/maintenance.html -f 
    RewriteCond %{SCRIPT_FILENAME} !maintenance.html 
    RewriteRule ^.*$ /system/maintenance.html [L] 

    Include <%= @params[:local_config] %>-ssl* 
</VirtualHost> 
<% end -%> 

Jeśli masz pytania, proszę pytać.

Najlepszy Daniel

EDIT:

lub po prostu skopiować to kucharskie https://github.com/neonlex/massive-octo-computing-machine opracowałem szybko. Ale OpsWorks powinien obsługiwać to domyślnie w przyszłości.

+0

Dziękuję życzliwie, Danielu. Udało mi się wymyślić coś, co ostatecznie dla mnie zadziałało (odpowiedź zamieszczona poniżej) i teraz, kiedy to działa, śmiertelnie boję się wypróbować twoją książkę kucharską z obawy przed jej złamaniem. Jestem ciekawy, jaki krok Jednorożca jest w twojej odpowiedzi i jakie masz przemyślenia na temat tego, co wymyśliłem. Dzięki! – manafire

+0

@neonlex Użyłem repo zaktualizowanego z nim działa dobrze. Próbowałem zastąpić polecenie powłoki ruby ​​poleceniem execute dsl w https://github.com/neonlex/massive-octo-computing-machine/blob/master/rails/libraries/rails_configuration.rb, podając błąd niezdefiniowanej metody 'execute '. jakikolwiek pomysł, dlaczego to nie zadziałało! – goutham

+0

Nie musiałem modyfikować/aktywów ani żadnych książek kucharskich. Po prostu posiadanie dla mnie before_symlink.rb. Jestem na nginxie i jednorożcu, używając domyślnych przepisów Opsworks. – Kirk

5

Niewiele wiem o OpsWorks i Chef, ale oto, co zrobiłem, aby działało.

Najpierw musiałem utworzyć przepis na szynę, który działa podczas zdarzenia setup, aby utworzyć katalog dowiązań symbolicznych dla zasobów. Zasiada w publicznym repozytorium, do którego ma dostęp OpsWorks.

kucharskie/szyny/recepty/symlink_assets.rb:

node[:deploy].each do |application, deploy| 
    Chef::Log.info("Ensuring shared/assets directory for #{application} app...") 

    directory "#{deploy[:deploy_to]}/shared/assets" do 
    group deploy[:group] 
    owner deploy[:user] 
    mode 0775 
    action :create 
    recursive true 
    end 
end 

Następnie w mojej aplikacji, musiałem stworzyć deploy/before_migrate.rb:

Chef::Log.info("Running deploy/before_migrate.rb...") 

Chef::Log.info("Symlinking #{release_path}/public/assets to #{new_resource.deploy_to}/shared/assets") 

link "#{release_path}/public/assets" do 
    to "#{new_resource.deploy_to}/shared/assets" 
end 

rails_env = new_resource.environment["RAILS_ENV"] 
Chef::Log.info("Precompiling assets for RAILS_ENV=#{rails_env}...") 

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

to dostać wywoływane podczas procesu wdrażania i kompiluje zasoby.

+0

Z jakiegoś powodu to wciąż próbuje odbuduj niektóre z moich skryptów, mimo że korzystam z katalogu zasobów współdzielonych. –

3

W AWS Opsworks używam następujący przepis:

execute 'rake assets:precompile' do 
    cwd "#{node[:deploy_to]}/current" 
    user 'root' 
    command 'bundle exec rake assets:precompile' 
    environment 'RAILS_ENV' => node[:environment_variables][:RAILS_ENV] 
end 

uruchomić to polecenie jako root ponieważ instancja wymaga odpowiedniego uprawnienia do zapisu ścieżki release. Uruchomienie polecenia jako użytkownik deploy powoduje odrzucenie uprawnień.

+0

Byłem zdezorientowany przez błąd odmowy uprawnień, ponieważ OpsWorks wydaje się ustawić użytkownika wdrażania jako właściciela wszystkiego we/shared. Okazało się, że ten użytkownik nadal tworzy swoje pliki z właścicielem root (poprzez ustawienie maski plików), więc tworzy plik dziennika, a następnie nie może go edytować. – zrisher

5

Należy zauważyć, że jeśli przekazujesz zmienne środowiskowe do swojej aplikacji Rails przy użyciu new OpsWorks feature, musisz uwzględnić te zmienne w swoim wywołaniu rake (ponieważ nie zostaną one trwale dostarczone do środowiska użytkownika wdrażania).

I wykonaj następujące czynności (na podstawie this article i this recipe) w deploy/before_migrate.rb:

Chef::Log.info("Precompiling assets for RAILS_ENV=" \ 
       "#{new_resource.environment['RAILS_ENV']}...") 

execute 'rake assets:precompile' do 
    cwd release_path 
    command 'bundle exec rake assets:precompile' 
    environment new_resource.environment 
end 
Powiązane problemy