Rails 3 – Erreurs Bundler / Capistrano

J’ai une application Rails 3 de base qui fonctionne localement sur ma boîte de développement, mais je veux tester dès le début le déploiement pour être sûr que tout fonctionne. J’utilise Capistrano pour déployer.

Lorsque j’exécute cap deploy (après toutes les autres configurations nécessaires), il interrompt 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 semble donc qu’il ne trouve pas 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 bundle fonctionne très bien.

Qu’est-ce qui pourrait mal tourner?

(En outre, 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 

METTRE À JOUR:

Pour RVM> = 1.11.3, vous devriez maintenant utiliser la gem rvm-capistrano . Pour les anciennes RVM> = 1.0.1, la réponse ci-dessous s’applique toujours.


RÉPONSE ORIGINALE:

Okay, bien que je n’ai toujours pas cap deploy complet pour fonctionner, j’ai corrigé ce problème. Le problème était que Capistrano essayait d’utiliser un chemin différent pour Bundler (et d’autres joyaux) que les chemins RVM.

Vérifiez votre chemin Capistrano en faisant cap shell , puis echo $PATH . Vous verrez probablement votre standard /usr/local/bin et /usr/bin , mais ce n’est pas là que RVM a stocké Bundler, et autres.

Modifiez votre fichier Capistrano config/deploy.rb et ajoutez les lignes suivantes, en suivant ces 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_ssortingng, '1.9.2' set :rvm_type, :user # Don't use system-wide RVM 

Cela a finalement permis à Capistrano de voir Bundler et de commencer à charger correctement les gemmes.

Bundler n’est pas trouvé car .bash_profile n’est pas chargé et donc votre PATH est 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 vers .bashrc et Capistrano devrait pouvoir le trouver (vérifiez également que .bash_profile sources .bashrc).

Capistrano utilise SSH pour exécuter des commandes sur le serveur via un shell non interactif . Cette session shell va générer le fichier .bashrc mais pas le fichier .bash_profile . J’ai ajouté une instruction ECHO aux deux et exécuté un LS via SSH. Vous pouvez voir dans les résultats ci-dessous que seul .bashrc provient de:

 $ ssh user@123.amazonaws.com ls .bashrc loaded git file1 file2 

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

Cette dernière ligne devrait en fait être

 set :rvm_type, :user 

c’est-à-dire que l’utilisateur doit être un symbole et non une variable, sinon vous aurez

 undefined local variable or method `user' 

Aucun rvm/capistrano n’a fonctionné pour moi. La meilleure solution que j’ai trouvée consistait à append au fichier deploy.rb la ligne suivante (c’est pour les fichiers RVM non système):

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

J’avais compris que la commande bundle n’était pas trouvée 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-XXX/bin:$PATH && bundle install vendor/gems" end 

Notez que j’inclus également le chemin d’access aux fichiers binarys PostgreSQL – l’installation du fichier pg échouait car ils étaient introuvables, même lorsque le fichier pouvait être trouvé.

Cela semble être une approche désordonnée, cependant. Vraisemblablement, il y a un endroit plus «global» pour définir des chemins vers des binarys que je ne connais pas.

Mise à jour 23/12

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

Cependant, cela ne sera toujours pas chargé car c’est un shell non-interactif non-interactif.

Une suggestion était d’append les chemins à / etc / bashrc: Comment définir $ PATH de telle sorte que `ssh user @ host commande` fonctionne?

Cependant, cela n’a pas fonctionné pour moi. Je crois que c’est parce que SSH ne charge pas non plus / etc / bashrc.

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

Celui-ci a travaillé pour moi:

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

J’ai essayé un certain nombre de suggestions. A 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, ajoutez:

 require "bundler/capistrano" 

Aussi dans config / deploy.rb, ou dans mon cas config / production.rb comme j’utilisais l’option multi-étapes pour Capistrano

 after "deploy", "rvm:trust_rvmrc" 

Cette étape garantit simplement que nous ne recevons plus le fichier “.rvmrc” et appelle une tâche dans le fichier deploy.rb, par exemple:

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

Après avoir apporté ces légères modifications, j’ai pu exécuter le cap production deploy qui a extrait le code; exécuté le déploiement du pipeline d’actifs, lié le dossier de publication à l’ bundle install en cours d’exécution exécutée et nettoyé.