OpsWorks不会在部署时预编译资源.我在
this thread发现这个食谱,但我认为这不完整,或者缺少一些东西,因为我发现没有发现release_path的错误.
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
日志:
undefined local variable or method `release_path' for ....
有任何想法吗?我根本不知道厨师,我正在试图弄清楚这一点.
解决方法
在OpsWorks开始使用资产管道之前,您可以这样做.
在rails应用程序中创建一个包含以下内容的deploy / before_symlink.rb文件.
在rails应用程序中创建一个包含以下内容的deploy / before_symlink.rb文件.
run "cd #{release_path} && RAILS_ENV=production bundle exec rake assets:precompile"
如果将Rails应用程序部署到其他环境,请更改RAILS_ENV.
如果您使用Nginx / Unicorn堆栈,则必须修改/资产资源.
只需将以下内容复制到您的食谱中的名为unicorn / templates / default / Nginx_unicorn_web_app.erb的文件中即可.
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 %>
如果您使用Apache2 / Passenger堆栈,则必须修改/ assets资源.
只需将以下内容复制到名为的文件中即可
在您的食谱中的passenger_apache2 / templates / default / web_app.conf.erb.
<VirtualHost *:80> ServerName <%= @params[:server_name] %> <% if @params[:server_aliases] && !@params[: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] && !@params[: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 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 -%>
如果您有任何疑问,请随时问.
最好
丹尼尔
编辑:
或者你只是复制这本食谱https://github.com/neonlex/massive-octo-computing-machine我开发得很快.但是OpsWorks应该在将来默认情况下支持这一点.