web-dev-qa-db-fra.com

Les actifs ne précompileront pas lors du déploiement avec capistrano pour la production sur Amazon EC2

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:

  1. Actifs précompilés localement, poussés vers github repo, cap déployé depuis des machines locales vers ec2. cap deploy est local, le code poussé sur ec2 est celui de github.
  2. Essayé d'utiliser les tâches capistrano comme suggéré. Utiliser des 'actifs' de déploiement 'de charge dans le fichier Capfile et laisser la tâche de déploiement de cap: tâche d'installation faire l'affaire.
  3. Utilisation de l'option cap deploy: assets: nettoyer puis cap deploy: assets: précompiler
  4. J'ai essayé de supprimer des actifs du public, puis d'utiliser une tâche pipeline_precompile dans deploy.rb.
  5. Actifs expirés, obligeant Rails à précompiler tout ce qui modifie assets.versions dans application.rb
  6. Essayé différentes combinaisons sur config.assets dans environnements/production.rb
  7. Enfin, vous avez essayé de supprimer le public/les actifs en production et de les précompiler à l’aide de Rails_ENV = ensemble de production exec rake assets: précompiler

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.

11
TKVR

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"
1
TKVR

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

13
Chris Aitchison

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"
1
Hendra Gunawan

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

1
mcr

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.

0
MarkDBlackwell

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é.

0
KevEllis