Les actifs ne seront pas précompilés lors du déploiement avec Capistrano à la production sur Amazon EC2

J'ai travaillé sur d'être en mesure de déployer à la production à l'aide de capistrano. Je fais face à plusieurs problèmes et lors de la fixation de la plupart d'entre eux, nous avons encore une dernière.

Notre précompiler des actifs options ne sont pas correctement leur compilation à la production et à cause de cela, nous ne pouvons pas utiliser les dernières fonctionnalités développées car elles s'appuient fortement sur JS.

Sans essayer d'influence sur la façon dont quelqu'un serait d'analyser ce problème, c'est une partie de ce que j'ai fait en essayant de le faire fonctionner:

  1. Précompilés actifs localement, poussé à l'dépôt github, casquette déployé à partir d'ordinateurs du réseau local à l'ec2. cap deploy est local, le code étant poussé à l'ec2 est celui sur github.
  2. Essayé d'utiliser capistrano tâches comme le suggère. À l'aide de la charge "à déployer'assets" dans le Capfile et de laisser le cap deploy:setup tâche de faire sa chose.
  3. Utilisé l'option cap deploy:actifs:nettoyer et ensuite cap deploy:actifs:précompiler
  4. Essayé d'enlever les biens de public, puis utiliser un pipeline_precompile tâche de déployer.rb
  5. Expiré actifs, forçant les rails de précompiler tout ce qui change de l'actif.les versions de l'application.rb
  6. Essayé différentes combinaisons de config.actifs dans des environnements de production.rb
  7. Enfin, essayé de supprimer publique/actifs dans la production et la précompilation de là-haut à l'aide de RAILS_ENV=production bundle exec rake actifs:précompiler

L'application est tout simplement pas l'aide de la nouvelle JS fichiers. Si vous examinez le code soit sur le repo ou dans le serveur lui-même, j'ai introduit un simple commentaire pour le nom.js.le café ("# Affiche et masque les menus en fonction des données sur DB" sur la ligne xxx) et ce n'est pas dans la compilation assets.js dans la production. C'est un test rapide pour être sûr que la récente actifs sont utilisés.

Tout le problème ici est les fichiers js et css, pas tellement rails de. C'est pourquoi il est si difficile de les vérifier ou de les trouver.. Donc l'une des raisons de la popularité de frameworks js ces derniers temps. En cas de problèmes, vous n'avez pas à vous tuer vous cherchez où est le problème.. Si le problème est en ruby ou rails, généralement ne prend pas longtemps pour le savoir. Une fois que vous obtenez js, css et de compatibilité du navigateur, et bien, c'EST le problème à portée de main.

Voici mon déployer.rb fichier. Rails de roulement 3.2.12 de ruby 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

Œuvre de nouvelles/alternatives (deploy_new2.rb) fichier:

# 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"

Et ./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

Je vous remercie d'avance pour toute aide! Laissez-moi savoir si vous avez besoin de plus d'infos.

source d'informationauteur TKVR