2010-09-17 4 views
52

J'ai une application Rails 3 de base qui fonctionne localement sur ma boîte de développement, mais je veux tester le déploiement très tôt pour m'assurer que tout fonctionne. J'utilise Capistrano pour le déploiement.Rails 3 - Erreurs Bundler/Capistrano

Quand je lance cap deploy (après tout autre configuration nécessaire), il se casse sur cette commande avec cette erreur:

[...] 
* executing 'bundle:install' 
* executing "bundle install --gemfile /var/www/trex/releases/20100917172521/Gemfile --path /var/www/trex/shared/bundle --deployment --quiet --without development test" 

servers: ["www.[my domain].com"] 
[www.[my domain].com] executing command 
** [out :: www.[my domain].com] sh: bundle: command not found 
command finished 
[...] 

il ressemble, il ne peut pas trouver la commande bundle sur le serveur.

Cependant, lorsque je me connecte au serveur ...

$ ruby -v 
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux] 
$ rails -v 
Rails 3.0.0 
$ bundle -v 
Bundler version 1.0.0 

... la commande fonctionne bundle très bien.

Qu'est-ce qui pourrait ne pas fonctionner?

-

(De plus, pour être complet :)

$ which ruby 
~/.rvm/rubies/ruby-1.9.2-p0/bin/ruby 
$ which rails 
~/.rvm/gems/ruby-1.9.2-p0/bin/rails 
$ which bundle 
~/.rvm/gems/ruby-1.9.2-p0/bin/bundle 

Répondre

89

MISE À JOUR:

Pour RVM> = 1.11.3, vous devriez maintenant il suffit d'utiliser la rvm-capistrano gem. Pour les anciens RVM> = 1.0.1, la réponse ci-dessous s'applique toujours.


RÉPONSE ORIGINAL:

Bon, si je encore ne l'ai pas obtenu un cap deploy plein pour travailler, je l'ai fait réparer ce problème. Le problème était Capistrano essayant d'utiliser un chemin différent pour Bundler (et d'autres gemmes) que les chemins RVM. Vérifiez votre chemin Capistrano en faisant cap shell, puis echo $PATH. Vous verrez probablement votre norme /usr/local/bin et /usr/bin, mais ce n'est pas là où RVM a Bundler, et al., Stockés.

Modifier votre Capistrano fichier config/deploy.rb, et ajoutez les lignes suivantes, par these instructions:

# Add RVM's lib directory to the load path. 
$:.unshift(File.expand_path('./lib', ENV['rvm_path'])) 

# Load RVM's capistrano plugin.  
require "rvm/capistrano" 

set :rvm_ruby_string, '1.9.2' 
set :rvm_type, :user # Don't use system-wide RVM 

Cela a finalement obtenu Capistrano voir Bundler et commencer gemmes de chargement de façon appropriée.

+1

J'ai système installé RVM large et le déploiement avec l'utilisateur local. Pour que cela fonctionne, je dois être sûr que l'utilisateur à partir duquel je suis en train de déployer a bien configuré le RVM. Le dépannage .bashrc décrit ici http://rvm.beginrescueend.com/rvm/install/ ici aidé –

+1

Peut-être que vous vous trouverez ici si vous avez essayé de mettre à niveau l'intégration de Capistrano rvm de ce qui est répertorié ici: http: // ariejan. net/2011/09/14/lighting-rapide-zero-downtime-déploiements-avec-git-capistrano-nginx-et-unicorn? utm_source = rubyweekly & utm_medium = email à la nouvelle approche mentionnée dans cette réponse. Si vous supprimez les lignes 'default_environment', assurez-vous de supprimer également' default_run_options [: shell] = 'bash'' sinon vous ne disposerez pas de rvm sur le shell capistrano. –

+0

Ça ne marche pas pour moi. Seulement cela fonctionne: set: bundle_cmd, 'source $ HOME/.bash_profile && bundle' – hipertracker

7

Cette dernière ligne devrait effectivement être

set :rvm_type, :user 

qui est, l'utilisateur doit être un symbole et non une variable, sinon vous aurez

undefined local variable or method `user' 
+1

Vous avez absolument raison. La réponse est mise à jour. –

2

Il était Je crois comprendre que la commande bundle est introuvable car la variable PATH, définie dans le fichier ~/.bash_profile de l'utilisateur, n'est pas chargée par Capistrano.

Pour contourner ce problème, j'ai créé une tâche: bundle_gems.

task :bundle_gems do 
    run "cd #{deploy_to}/current && export PATH=/usr/local/pgsql/bin:/opt/ruby-enterprise-X.X.X/bin:$PATH && bundle install vendor/gems" 
end 

Notez que j'inclure également le chemin vers les binaires PostgreSQL - installation de la pierre précieuse p échouait parce qu'ils ne pouvaient pas être trouvé, même quand pourrait être trouvé paquet.

Cela semble toutefois être une approche compliquée. On peut supposer qu'il existe un endroit plus «global» pour définir les chemins vers les binaires que je ne connais pas.

Mise à jour 23/12

Pour ajouter un répertoire à $ PATH pour tous les utilisateurs: https://serverfault.com/questions/102932/adding-a-directory-to-path-in-centos

Toutefois, ce ne sera pas encore chargé, car il est une coquille non-connexion non interactive.

On a suggéré d'ajouter les chemins vers/etc/bashrc: How do I set $PATH such that `ssh [email protected] command` works?

Cependant, cela ne fonctionnait pas aussi pour moi. Je crois que c'est parce que SSH ne charge pas/etc/bashrc non plus.

Une autre suggestion était d'éditer ~/.ssh/environment: http://www.ruby-forum.com/topic/79248. Cependant, cela semble presque aussi compliqué que de spécifier les chemins dans deploy.rb.

26

Le bundler est introuvable car le fichier .bash_profile n'est pas chargé et votre PATH est donc incorrect. C'est probablement parce que vous avez le script RVM dans .bash_profile.

La réponse simple est de déplacer le script RVM de .bash_profile à .bashrc et Capistrano devrait être capable de le trouver (vérifiez également que .bash_profile sources .bashrc).

Capistrano utilise SSH pour exécuter des commandes sur le serveur via un non-interactive shell. Cette session shell va source .bashrc but not .bash_profile. J'ai ajouté une déclaration ECHO aux deux et a couru un LS via SSH. Vous pouvez le voir dans les résultats ci-dessous qui ne .bashrc provient:

$ ssh [email protected] ls 
.bashrc loaded 
git 
file1 
file2 
+0

Est-ce une bonne pratique de toujours trouver votre '.bash_profile' dans votre' .bashrc'? De cette façon, votre fichier '.bash_profile' est toujours généré, qu'il s'agisse d'un shell interactif ou non interactif. – user2490003

7

Pas rvm/capistrano a fonctionné pour moi. La meilleure solution que j'ai trouvé l'ajout de fichier deploy.rb la ligne suivante (il est pour RVM non système):

set :bundle_cmd, 'source $HOME/.bash_profile && bundle'

+4

Hm ... obtenir maintenant une erreur 'sh: source: not found'. – Vivek

11

J'ai eu un problème identique à l'aide rbenv. La solution consistait à prendre les lignes spécifiques de rbenv au bas de mon fichier .bashrc et à les placer en haut. La première ligne de mon fichier .bashrc retournait l'abandon si le shell ne fonctionnait pas en mode interactif.

0

J'ai essayé un certain nombre de suggestions. J'ai eu des problèmes avec la définition des chemins dans le fichier deploy.rb pour l'environnement RVM. Ma solution finale était d'inclure les éléments suivants:

Dans le fichier config/deploy.rb ajouter:

require "bundler/capistrano" 

également dans config/deploy.rb, ou dans mon cas config/production.rb comme je l'étais en utilisant l'option multiétages pour Capistrano

after "deploy", "rvm:trust_rvmrc" 

Cette étape garantit simplement que nous cessons d'obtenir le « voulez-vous faire confiance au fichier .rvmrc » et il appelle une tâche dans le déploiement.fichier rb tels que:

namespace :rvm do 
    task :trust_rvmrc do 
     run "rvm rvmrc trust #{release_path}" 
    end 
end 

Après avoir mis dans ces légers changements, j'ai pu exécuter cap production deploy qui a vérifié le code; a exécuté le déploiement du pipeline d'actifs, a relié le dossier de version à l'actuel, a exécuté bundle install et a nettoyé.

1

Celui-ci a fonctionné pour moi:

ensemble: bundle_cmd, 'source $ HOME/.bash_profile & bundle &'