2009-11-27 6 views
1

Ma coutume tâche Capistrano « application: l'échantillon » échoue avec le message d'erreur suivant:Capistrano tâche personnalisée échoue parce que « Rails nécessite RubyGems> = 1.3.2 »

mnylen ilmo-on-rails $ cap app:sample 
* executing `app:sample' 
* executing "export RAILS_ENV=production; cd /home/mnylen/ilmo-on-rails/current; ruby script/coursegen 10" 
servers: ["rails.cs.helsinki.fi"] 
* establishing connection to gateway `melkinpaasi.cs.helsinki.fi' 
* Creating gateway using melkinpaasi.cs.helsinki.fi 
* establishing connection to `rails.cs.helsinki.fi' via gateway 
Password: 
[rails.cs.helsinki.fi] executing command 
*** [err :: rails.cs.helsinki.fi] Rails requires RubyGems >= 1.3.2. Please install RubyGems and try again: http://rubygems.rubyforge.org 
command finished 
failed: "sh -c 'export RAILS_ENV=production; cd /home/mnylen/ilmo-on-rails/current; ruby script/coursegen 10'" on rails.cs.helsinki.fi 

Suis-je manque quelque chose ou faire quelque chose de mal? La tâche est:

namespace :app do 
    desc "Run sample data on production2 
    task :sample do 
    run "export RAILS_ENV=production; cd #{current_path}; ruby script/coursegen 10" 
    end 
end 

Si je lance la même commande à partir du serveur réel, il fonctionne très bien.

Répondre

1

OK, résolu.

Le problème était qu'il y avait deux installations Ruby sur le serveur de production.

Le fichier .profile sous mon répertoire personnel sur le serveur de production la variable d'environnement PATH pour pointer vers la version Ruby correcte.

commande run, il semble, ne lit pas le fichier .profile et donc, en cours d'exécution script Ruby/coursegen 10 dans la tâche a utilisé la mauvaise version Ruby, qui était la raison de l'erreur bizarre un message sur la version de RubyGems. Cela explique également pourquoi cela a fonctionné lors de l'exécution manuelle de la commande à partir du shell des serveurs de production.

Ma solution a été d'utiliser le chemin complet de l'exécutable Ruby dans ma tâche d'exécution, comme ceci:

run "export RAILS_ENV=production; cd #{current_path}; /opt/ruby-enterprise-1.8.7-2009.10/bin/ruby script/coursegen 10" 

Bien sûr, ce n'est pas jolie, mais cela fonctionne. Si quelqu'un a des solutions plus jolies, je serais plus qu'heureux de les utiliser à la place. :)

0

On dirait que vous devriez mettre à jour votre RubyGems sur le serveur distant.

+0

Merci pour votre réponse. Cependant, gem --version sur le serveur distant indique que la version de RubyGems est 1.3.5 et donc, selon le message d'erreur, aucune mise à jour ne devrait être nécessaire. Et bien, cela fonctionne toujours si je me connecte manuellement au serveur distant et exécute cette commande. :-) – mnylen

+0

C'est assez bizarre alors. +1 pour votre question pour vous donner du courage. ;) –

1

Cap exécute la commande remote en tant qu'utilisateur inattendu - et cet utilisateur n'a pas le bon chemin vers ruby ​​et gem. Vérifiez vos paramètres dans votre recette pour :user et :use_sudo. Lisez attentivement la sortie du cap pour voir quel utilisateur est connecté. Je vois que vous utilisez un :gateway; il peut y avoir deux utilisateurs dans ce cas. Un pour se connecter à la passerelle, et un autre pour exécuter des commandes sur le serveur cible.

+0

Merci. Cela clarifie un peu les choses. J'ai modifié la tâche pour exécuter ruby ​​--version. Il semble que ce soit en utilisant la mauvaise version de Ruby. Puis-je en quelque sorte définir le chemin des exécutables ruby ​​et gem dans ma recette de déploiement? – mnylen

+0

Oh, j'ai oublié de mentionner, j'ai essayé de mettre le bon chemin de ruby ​​dans mon fichier .profile. Dans ma recette, j'utilise set: use_sudo, false set: user, "mnylen" – mnylen