9

Ich habe daran gearbeitet, die Produktion mit capistrano zu produktivieren. Ich habe mehrere Probleme und während ich die meisten repariere, haben wir noch eine letzte.Assets werden bei der Bereitstellung mit capistrano zur Produktion auf Amazon EC2 nicht vorkompiliert.

Unsere Optionen für Vorkompilierungs-Assets kompilieren sie nicht ordnungsgemäß in der Produktion, und deshalb können wir die zuletzt entwickelten Funktionen nicht verwenden, da sie stark von JS abhängen.

Ohne zu versuchen, auf beeinflussen, wie jemand dieses Problem analysieren würde, das ist etwas, was ich es Arbeit zu machen habe versucht:

  1. Precompiled Vermögen lokal auf GitHub Repo geschoben, Kappe von lokalen Rechnern eingesetzt ec2. cap deploy ist lokal, der auf ec2 gedrückte Code ist der auf github.
  2. Mit Capistrano Aufgaben wie vorgeschlagen versucht. Lade 'deploy'assets' in die Capfile laden und den cap deployen lassen: setup task tut was.
  3. die Option cap deploy Gebraucht: Aktiva: sauber und dann die Kappe bereitstellen: Vermögenswerte: precompile
  4. aus öffentlichen Versuchte Entfernen Vermögenswerte und dann eine pipeline_precompile Aufgabe in deploy.rb
  5. Expired Vermögen zu verwenden, Schienen zwingt alles vorzukompilieren Wechsel assets.versions in application.rb
  6. versucht, verschiedene Kombinationen auf config.assets in Umgebungen/production.rb
  7. Schließlich versucht das Löschen mit dort öffentlich/Vermögen in der Produktion und Vorkompilieren bis RAILS_ENV = Produktionsbündel exec Rake Vermögen: precompile

Die App verwendet einfach nicht die neuen JS-Dateien. Wenn Sie den Code entweder auf dem Repo oder auf dem Server selbst überprüfen, habe ich einen einfachen Kommentar zu name.js.coffee ("# Zeigt und verbirgt Menüs abhängig von den Daten in DB" in Zeile xxx) und das ist nicht in die kompilierten assets.js in der Produktion. Dies ist ein kurzer Test, um sicher zu gehen, dass die letzten Assets verwendet werden.

Das ganze Problem hier ist die js und CSS-Dateien, nicht so viel Schienen. Deshalb ist es so schwer zu testen oder zu finden. Dies ist einer der Gründe für die Popularität von js Frameworks in letzter Zeit. Im Falle von Problemen müssen Sie sich nicht umbringen, wenn Sie nach dem Problem suchen. Wenn das Problem in Rubin oder Schienen liegt, dauert es normalerweise nicht lange, bis Sie es herausfinden. Sobald Sie zu js, CSS und Cross-Browser-Kompatibilität, gut, das ist das Problem zur Hand.

Hier ist meine deploy.rb-Datei. Laufschienen 3.2.12 Rubin-1.9.3-P327:

# $:.unshift(File.expand_path('./lib', ENV['rvm_path'])) 

# Load rvm's capistrono plugins 
require 'rvm/capistrano' 

require 'bundler/capistrano' 

set :rvm_type, :user 

set :user, 'username' 
set :domain, 'ip_address' 
set :application, "app_pro" 
set :keep_releases, 2 # It keeps on two old releases. 

# git repo details 
set :scm, :git # You can set :scm explicitly or Capistrano will make an intelligent guess based on known version control directory names 
set :repository, "[email protected]:user/app.git" 
set :scm_username, 'user' 
set :git_enable_submodules, 1 
set :git_shallow_clone, 1 
set :branch, 'master' 

# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none` 


role :web, domain       # Your HTTP server, Apache/etc 
role :app, domain       # This may be the same as your `Web` server 
role :db, domain, :primary => true# 'ec2-23-23-156-118.compute-1.amazonaws.com' This is where Rails migrations will run 
# role :db, "your slave db-server here" 

# deply options 
default_run_options[:pty] = true 
set :ssh_options, {:forward_agent => true} 
set :ssh_options, {:auth_methods => "publickey"} 
set :ssh_options, {:keys => ["~/Downloads/key.pem"]} 
set :deploy_to, "/home/user/appdir" 
set :deploy_via, :remote_cache 
set :use_sudo, false 

# if you want to clean up old releases on each deploy uncomment this: 
after "deploy:restart", "deploy:cleanup" 

# if you're still using the script/reaper helper you will need 
# these http://github.com/rails/irs_process_scripts 

# If you are using Passenger mod_rails uncomment this: 
namespace :deploy do 
    task :start do 
    # run COMMAND="/etc/init.d/nginx restart" invoke SUDO=1 
    run "sudo /etc/init.d/nginx restart" 
    # exit 
    end 
    after "deploy:start", "deploy:cleanup" 

    task :stop do ; end 
    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "touch #{File.join(current_path,'tmp','restart.txt')}" 
    end 

    task :setup_config, roles: :app do 
    run "mkdir -p #{shared_path}/config" 
    put File.read("config/database.example.yml"), "#{shared_path}/config/database.yml" 
    puts 'now edit the config file database in #{shared_path}' 
    end 
    after 'deploy:setup', 'deploy:setup_config' 

    desc "Symlink shared resources on each release - not used" 
    task :symlink_config, :roles => :app do 
    run "ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml" 
    end 

    after 'deploy:finalize_update', 'deploy:symlink_config' 

    desc "It helps to seed database with values" 
    task :seed do 
    run "cd #{current_path}; bundle exec rake db:seed RAILS_ENV=#{rails_env}" 
    end 
    task :create_schema do 
    run "cd #{current_path}; bundle exec rake db:create RAILS_ENV=#{rails_env} --trace" 
    end 
end 

On-Arbeits neue/alternative (deploy_new2.rb) file:

# On-working new/alternative deploy.rb file: 

require 'rvm/capistrano' 
require 'bundler/capistrano' 

set :rvm_type, :user 

set :application, "ip_address" 
set :domain, 'ip_address' 

# Roles 
role :web, domain 
role :app, domain 
role :db, domain, :primary => true 

#deployment details 
set :deploy_via, :remote_cache 
set :user, "username" 
set :copy_compression, :bz2 
set :git_shallow_clone, 1 
set :scm_verbose, true 
set :use_sudo, false 
set :deploy_to, "/home/user/dir" 

default_run_options[:pty] = true 
set :ssh_options, {:forward_agent => true} 
set :ssh_options, {:auth_methods => "publickey"} 
set :ssh_options, {:keys => ["~/Downloads/key.pem"]} 

#repo details 
set :scm, :git 
set :repository, "[email protected]:user/app.git" 
set :scm_username, 'user' 
set :keep_releases, 2 
set :branch, "master" 


namespace :deploy do 
    # task :start, :roles => :app, :except => { :no_release => true } do 
    # # not need to restart nginx every time 
    # # run "service nginx start" 
    # run "cd #{release_path} && touch tmp/restart.txt" 
    # end 

    # after "deploy:start", "deploy:cleanup" 
    # after 'deploy:cleanup', 'deploy:symlink_config' 

    # You do not need reload nginx every time, eventhought if you use passenger or unicorn 
    # task :stop, :roles => :app, :except => { :no_release => true } do 
    # run "service nginx stop" 
    # end 

    # task :graceful_stop, :roles => :app, :except => { :no_release => true } do 
    # run "service nginx stop" 
    # end 

    # task :reload, :roles => :app, :except => { :no_release => true } do 
    # run "cd #{release_path} && touch tmp/restart.txt" 
    # run "service nginx restart" 
    # end 

    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "cd #{release_path} && touch tmp/restart.txt" 
    end 

    # If you enable assets/deploy in Capfile, you do not need this 
    # task :pipeline_precompile do 
    # # run "cd #{release_path}; RAILS_ENV=#{rails_env} bundle exec rake assets:precompile" 
    # # precompile assets before deploy and upload them to server 
    # # run_locally("RAILS_ENV=#{rails_env} rake assets:clean && RAILS_ENV=#{rails_env} rake assets:precompile") 
    # # top.upload "public/assets", "#{release_path}/public/assets", :via =>:scp, :recursive => true 
    # end 
end 

# you do not need to this, because you already add require 'bundler/capistrano' 
# before "deploy:assets:precompile", "bundle:install" 

Und ./Capfile:

load 'deploy' 
# Uncomment if you are using Rails' asset pipeline 
load 'deploy/assets' 
load 'config/deploy' # remove this line to skip loading any of the default tasks 

Vielen Dank im Voraus für jede Hilfe! Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

+0

denken Jeder aus den Protokollen, dass es ein Caching-Problem sein könnte? – TKVR

+0

Wahrscheinlich nicht, da Sie versucht haben, die Assets auslaufen zu lassen. – MarkDBlackwell

+0

Ich sehe "Schienen Fehler: nicht auf Protokolldatei zugreifen" oben. Gut vielleicht, um die Zeile "log/*" aus .gitignore zu entfernen (vorausgesetzt, Sie haben dort schon "log/*. Log") und "touch log/.gitkeep", fügen Sie hinzu, commit und deploy erneut, um zu sehen das Protokoll zur Bereitstellung der Produktionszeit in /home/ubuntu/teamzoom_pro_set2/releases/*/log/production.log. Vielleicht ist das Log-Verzeichnis beim Entpacken von Git nicht vorhanden. – MarkDBlackwell

Antwort

1

Lösung: Hier ist der Arbeits File-

require 'rvm/capistrano' 
require 'bundler/capistrano' 

set :rvm_type, :user 

set :application, "ip_address" 
set :domain, 'ip_address' 

# Roles 
role :web, domain 
role :app, domain 
role :db, domain, :primary => true 

#deployment details 
set :deploy_via, :remote_cache 
set :user, "user" 
set :copy_compression, :bz2 
set :git_shallow_clone, 1 
set :scm_verbose, true 
set :use_sudo, false 
set :deploy_to, "/home/user/app_dir" 

default_run_options[:pty] = true 
set :ssh_options, {:forward_agent => true} 
set :ssh_options, {:auth_methods => "publickey"} 
set :ssh_options, {:keys => ["~/sites/app/config/key.pem"]} 

#repo details 
set :scm, :git 
set :repository, "[email protected]:github_id/app.git" 
set :scm_username, 'github_id' 
set :keep_releases, 2 
set :branch, "master" 

after 'deploy:update_code', 'deploy:symlink_db' 

namespace :deploy do 
    # task :start, :roles => :app, :except => { :no_release => true } do 
    # # not need to restart nginx every time 
    # # run "service nginx start" 
    # run "cd #{release_path} && touch tmp/restart.txt" 
    # end 

    # after "deploy:start", "deploy:cleanup" 
    # after 'deploy:cleanup', 'deploy:symlink_config' 

    # You do not need reload nginx every time, eventhought if you use passenger or unicorn 
    # task :stop, :roles => :app, :except => { :no_release => true } do 
    # run "service nginx stop" 
    # end 

    # task :graceful_stop, :roles => :app, :except => { :no_release => true } do 
    # run "service nginx stop" 
    # end 

    # task :reload, :roles => :app, :except => { :no_release => true } do 
    # run "cd #{release_path} && touch tmp/restart.txt" 
    # run "service nginx restart" 
    # end 

    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "cd #{release_path} && touch tmp/restart.txt" 
    end 

    desc "Symlinks the database.yml" 
    task :symlink_db, :roles => :app do 
    run "ln -nfs #{deploy_to}/shared/config/database.yml #{release_path}/config/database.yml" 
    end 

    # If you enable assets/deploy in Capfile, you do not need this 
    # task :pipeline_precompile do 
    # # run "cd #{release_path}; RAILS_ENV=#{rails_env} bundle exec rake assets:precompile" 
    # # precompile assets before deploy and upload them to server 
    # # run_locally("RAILS_ENV=#{rails_env} rake assets:clean && RAILS_ENV=#{rails_env} rake assets:precompile") 
    # # top.upload "public/assets", "#{release_path}/public/assets", :via =>:scp, :recursive => true 
    # end 
end 

# you do not need to this, because you already add require 'bundler/capistrano' 
# before "deploy:assets:precompile", "bundle:install" 
12

Sie benötigen keine eigene: precompile_assets Aufgabe. Sie verwenden Capistrano's, indem Sie die Last 'Deploy/Assets' in Ihre Capfile aufnehmen.

Das Entfernen der Task ": precompile_assets" aus Ihrem deploy.rb kann das Problem beheben.Wenn Sie sich den Quellcode für Capistrano schauen, sehen Sie, es implementiert: precompile_assets ganz anders: https://github.com/capistrano/capistrano/blob/legacy-v2/lib/capistrano/recipes/deploy/assets.rb

+0

Hinzugefügt mehr Info und aktualisierte Datei. Funktioniert immer noch nicht. – TKVR

+0

Sie brauchen tatsächlich keine: pipeline_precompile-Aufgabe. Nimm alle Referenzen dazu heraus. Capistrano hat die Logik zum Vorkompilieren eingebaut. Wenn das immer noch nicht funktioniert, können Sie die Ausgabe, die Capistrano protokolliert, veröffentlichen. Prost. –

+0

Die obigen Capistrano-Protokolle hinzugefügt. – TKVR

1

Sie diesen Code versuchen

# On-working new/alternative deploy.rb file: 

require 'rvm/capistrano' 
require 'bundler/capistrano' 

set :rvm_type, :user 

set :application, "ip_address" 
set :domain, 'ip_address' 

# Roles 
role :web, domain 
role :app, domain 
role :db, domain, :primary => true 

#deployment details 
set :deploy_via, :remote_cache 
set :user, "username" 
set :copy_compression, :bz2 
set :git_shallow_clone, 1 
set :scm_verbose, true 
set :use_sudo, false 
set :deploy_to, "/home/user/dir" 

default_run_options[:pty] = true 
set :ssh_options, {:forward_agent => true} 
set :ssh_options, {:auth_methods => "publickey"} 
set :ssh_options, {:keys => ["~/Downloads/key.pem"]} 

#repo details 
set :scm, :git 
set :repository, "[email protected]:user/app.git" 
set :scm_username, 'user' 
set :keep_releases, 2 
set :branch, "master" 


namespace :deploy do 
    # task :start, :roles => :app, :except => { :no_release => true } do 
    # # not need to restart nginx every time 
    # # run "service nginx start" 
    # run "cd #{release_path} && touch tmp/restart.txt" 
    # end 

    # after "deploy:start", "deploy:cleanup" 
    # after 'deploy:cleanup', 'deploy:symlink_config' 

    # You do not need reload nginx every time, eventhought if you use passenger or unicorn 
    # task :stop, :roles => :app, :except => { :no_release => true } do 
    # run "service nginx stop" 
    # end 

    # task :graceful_stop, :roles => :app, :except => { :no_release => true } do 
    # run "service nginx stop" 
    # end 

    # task :reload, :roles => :app, :except => { :no_release => true } do 
    # run "cd #{release_path} && touch tmp/restart.txt" 
    # run "service nginx restart" 
    # end 

    task :restart, :roles => :app, :except => { :no_release => true } do 
    run "cd #{release_path} && touch tmp/restart.txt" 
    end 

    # If you enable assets/deploy in Capfile, you do not need this 
    # task :pipeline_precompile do 
    # # run "cd #{release_path}; RAILS_ENV=#{rails_env} bundle exec rake assets:precompile" 
    # # precompile assets before deploy and upload them to server 
    # # run_locally("RAILS_ENV=#{rails_env} rake assets:clean && RAILS_ENV=#{rails_env} rake assets:precompile") 
    # # top.upload "public/assets", "#{release_path}/public/assets", :via =>:scp, :recursive => true 
    # end 
end 

# you do not need to this, because you already add require 'bundler/capistrano' 
# before "deploy:assets:precompile", "bundle:install" 
+0

Manuelles Hochladen der App und der Assets vorerst, während ich eine bessere Bereitstellungslösung ausarbeite, aber dieses Skript funktioniert, nachdem ich zahlreiche Fehler behoben habe, die mit der Arbeit eines früheren Entwicklers zusammenhängen. – TKVR

+0

Verstanden. Siehe untenstehende finale Version der Deploy-Datei. – TKVR

0

Wenn Sie uglifier in Gemfile haben, die bei der Asset-Kompilierung läuft Es wurde möglicherweise so konfiguriert, dass nur die Art des Kommentars entfernt wird, die Sie als Test dafür verwenden, ob die geänderten JavaScript-Assets bereitgestellt werden.

Uglifier Readme says Dies ist möglich, und unterscheidet mehrere Arten von Kommentaren. Es ist also möglich, dass Sie in die Irre geführt wurden, nachdem nach der Zusammenstellung der Assets noch ein Kommentar angezeigt wurde.

Ein weiterer Hinweis zur Beurteilung dieser Möglichkeit ist, dass (wie Sie sagen) dieses Problem nach einem langen (ermüdenden) Prozess der Behebung anderer Probleme entstanden ist. Oft kann dies Menschen von einer solchen Wahrnehmung abhalten; eine lange Anstrengung kann sie zu einer Annahme "einsperren".

Versuchen Sie also, in Ihrem Javascript eine Variablendeklaration anstelle eines Kommentars hinzuzufügen.

1

ich, dass die Capistrano Asset Regeln wurde vor den Bündler Regeln ausführen kompilieren gefunden implementieren ist, also nichts arbeitete, schrieb ich meine eigenen:

after "bundle:install" do 
    run "cd #{release_path}; RAILS_ENV=production bundle exec rake assets:precompile" 
    end 

Ich habe dann festgestellt, dass ich wirklich nicht daran interessiert war, eine js-Runtime auf meinen Produktionsmaschinen zu installieren. Ich ging zurück, um meine Assets einfach in einen Deploy-Zweig meines Git-Baumes zu bringen. Zum ersten Mal habe ich vergessen, die Datei manifest.yml einzuschließen.

http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html