web-dev-qa-db-fra.com

Rails 3 - Erreurs Bundler / Capistrano

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

Quand je lance cap deploy (après toutes les autres configurations nécessaires), il casse 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?

-

(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
53
T.J. Schuck

MISE À JOUR:

Pour RVM> = 1.11.3, vous devez maintenant simplement utiliser le rvm-capistrano gem . Pour les anciens RVM> = 1.0.1, la réponse ci-dessous s'applique toujours.


RÉPONSE ORIGINALE:

D'accord, même si je encore n'ai pas obtenu un cap deploy Complet pour travailler, j'ai résolu le problème ceci. Le problème était que Capistrano essayait 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 /usr/local/bin Et /usr/bin Standard, mais ce n'est pas là que RVM a Bundler, et al., Stocké.

Modifiez votre fichier Capistrano config/deploy.rb Et ajoutez les lignes suivantes, par 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_string, '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 les gemmes de manière appropriée.

89
T.J. Schuck

Bundler est introuvable car .bash_profile n'est pas en cours de chargement 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 être capable de le trouver (vérifiez également que .bash_profile source .bashrc).

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

$ ssh [email protected] ls
.bashrc loaded
git
file1
file2
26
Pete Campbell

J'ai eu un problème identique en utilisant rbenv. La solution était de prendre les lignes spécifiques à rbenv en bas de mon fichier .bashrc et de les placer en haut. La première ligne de mon fichier .bashrc renvoyait l'abandon si le shell ne s'exécutait pas en mode interactif.

11
Lelon

Cette dernière ligne devrait être

set :rvm_type, :user

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

undefined local variable or method `user'
7
RussK

Non rvm/capistrano a fonctionné pour moi. La meilleure solution que j'ai trouvée consistait à ajouter à deploy.rb fichier la ligne suivante (c'est pour RVM non système):

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

7
hipertracker

J'ai cru comprendre que la commande bundle n'est pas trouvée car la variable PATH, définie dans le ~/.bash_profile de l'utilisateur, n'est pas chargée par Capistrano.

Pour contourner cela, 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'inclus également le chemin vers les binaires PostgreSQL - l'installation du pg gem échouait car ils ne pouvaient pas être trouvés, même lorsque le bundle pouvait être trouvé.

Cela semble cependant être une approche désordonnée. Vraisemblablement, il y a 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

Cependant, cela ne sera toujours pas chargé car il s'agit d'un shell non interactif sans connexion.

Une suggestion a été d'ajouter les chemins d'accès à/etc/bashrc: Comment puis-je définir $ PATH de telle sorte que `ssh user @ Host command` fonctionne?

Mais cela n'a pas fonctionné non plus pour moi. Je pense que c'est parce que SSH ne charge pas non plus/etc/bashrc.

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

2
Sai Perchard

Celui-ci a fonctionné pour moi:

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

1
Nesha Zoric

J'ai essayé un certain nombre de suggestions. A rencontré des problèmes pour définir les chemins d'accès dans le fichier deploy.rb pour l'environnement RVM. Ma dernière solution consistait à 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 car j'utilisais l'option multi-étapes pour Capistrano

after "deploy", "rvm:trust_rvmrc"

Cette étape garantit simplement que nous ne recevons plus le message "Voulez-vous faire confiance au fichier .rvmrc" et appelle une tâche dans le fichier deploy.rb telle que:

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 cap production deploy qui a extrait le code; exécuté le déploiement du pipeline d'actifs, lié le dossier de version au courant, exécuté bundle install et nettoyé.

0
Grant Sayer