J'ai travaillé pour pouvoir passer à la production en utilisant capistrano. Je suis confronté à plusieurs problèmes et nous avons encore un dernier problème à résoudre.
Nos options d'actifs de précompilation ne les compilent pas correctement en production et, de ce fait, nous ne pouvons pas utiliser les dernières fonctionnalités développées car elles reposent fortement sur JS.
Sans essayer d'influencer la manière dont quelqu'un analyserait ce problème, voici quelques-unes de mes tentatives pour le faire fonctionner:
L'application n'utilise tout simplement pas les nouveaux fichiers JS. Si vous vérifiez le code sur le référentiel ou sur le serveur lui-même, j'ai ajouté un commentaire simple à name.js.coffee ("# Affiche et masque les menus en fonction des données de la base de données" sur la ligne xxx) et ceci n'est pas dans. les assets.js compilés en production. Ceci est un test rapide pour vous assurer que les actifs récents sont utilisés.
Tout le problème ici concerne les fichiers js et css, pas tellement Rails. C’est pourquoi il est si difficile de tester ou de trouver .. C’est l’une des raisons de la popularité des frameworks js ces derniers temps. En cas de problème, vous n'êtes pas obligé de vous tuer en cherchant où se situe le problème. Si le problème est en Ruby ou Rails, cela ne prend généralement pas si longtemps. Une fois que vous avez js, css et compatibilité de navigateur croisée, eh bien, ceci IS le problème qui se pose.
Voici mon fichier deploy.rb. Running Rails 3.2.12 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
Nouveau/fichier alternatif (deploy_new2.rb) en cours d'utilisation:
# 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
Merci d'avance pour toute aide! Tenez-moi au courant si vous avez besoin de plus d'informations.
Solution: Voici le fichier de travail de travail -
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"
Vous n'avez pas besoin de votre propre tâche: precompile_assets. Vous utilisez Capistrano en incluant la charge 'deploy/assets' dans votre Capfile.
Le fait de supprimer la tâche: precompile_assets de deploy.rb peut résoudre le problème. Si vous regardez le code source de Capistrano, vous verrez qu'il implémente: precompile_assets de manière très différente: https://github.com/capistrano/capistrano/blob/legacy-v2/lib/capistrano/recipes/deploy/assets .rb
Vous pouvez essayer ce code
# 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"
J'ai constaté que les règles de compilation d'actifs de capistrano avaient été exécutées avant les règles de regroupement, donc rien n'a fonctionné, j'ai écrit le mien:
after "bundle:install" do
run "cd #{release_path}; Rails_ENV=production bundle exec rake assets:precompile"
end
J'ai ensuite constaté que l'installation d'un runtime js sur mes machines de production ne m'intéressait pas vraiment. Je suis revenu à mes ressources dans une branche de déploiement de mon arbre git. Pour la première fois, j’ai oublié d’inclure le fichier manifest.yml.
http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html
Si vous avez uglifier dans Gemfile, qui s'exécute lors de la compilation d'actifs, il a peut-être été configuré pour supprimer uniquement le type de commentaire que vous utilisez comme test pour savoir si les actifs Javascript modifiés sont déployés.
Le fichier Lisez-moi d'Uglifier dit c'est possible, et distingue plusieurs types de commentaires. Il est donc possible que vous ayez été induit en erreur en voyant qu'il restait un commentaire après la compilation de l'actif.
Un autre indice pour juger de cette possibilité est que (comme vous le dites) ce problème est survenu après un long (fatigant) processus de résolution d'autres problèmes. Souvent, cela peut empêcher les gens d'avoir une telle perception. un long effort peut les «enfermer» dans une hypothèse.
Donc, essayez d'ajouter une déclaration de variable au lieu d'un commentaire, dans votre Javascript.
J'avais un problème similaire à celui-ci, mais la solution consistait à supprimer le groupe d'actifs du fichier Gemfile, car la limite de tâche par défaut utilisée pour précompiler dépend du fait que les actifs ne font pas partie d'un groupe séparé.