30 mars 2017

Ruby et Rvm

Après une première installation de Ruby on peut avoir besoin de tester notre application sur une autre version. Pour cela on utilise Rvm. Après avoir installé rvm voyons donc son fonctionnement.
Par exemple on se retrouve avec un système exemple Debian + ruby 2.1.5 d’une part, rvm et la version installée disons 2.4.1 d’autre part. Passons de l’un à l’autre

ruby -v   # Version installée par le systeme
rvm list  # Versions installées par rvm

Liste versions ruby

On constate ici que nous sommes en mode (*)’default’ mais pas current(=*). Ce qui veut dire que ce n’est pas la version en cours. Autrement dit rvm n’est pas actif.
Pour passer de l’un à l’autre

ruby -v
rvm --default use 2.4.1 #pour passer à la 2.4.1 et mettre par défaut
ruby -v
rvm use system
ruby -v
rvm use default
rvm list

Bien, nous avons plusieurs environnements et nous savons passer de l’un à l’autre. Il faut savoir que chaque environnement est complètement indépendant l’un de l’autre. Donc si on installe des gems dans un environnement, ils ne seront pas disponibles dans les autres. (Autrement dit si on installe un programme dans une version ruby de rvm, en basculant sur une autre on ne pourra pas le lançer).
Il permet aussi d’avoir des groupes de gems (Gemset) pour éviter les conflits de version entre les projets. Il y’a deux gemsets au minimum par versions de ruby installées default et global. Et on peut ajouter, supprimer autant de gemsets que l’on veut avec la commande rvm idoine. On peut donc créer un gemset par site mais si le projet est géré par bundler ce n’est pas nécesssaire.

 /--------------------------|----------------------\
 |           rvm 2.4.1      |    rvm autres ruby   |
 |--------------------------|----------------------|
 |           @global        |     @global          |
 |--------------------------|----------------------|
 | @default | @app1 | @appX | @default | @appX     |
 \--------------------------|----------------------/

Évidemment le ruby système n’a pas de gemset car il n’est pas géré par rvm.

Installation de gems avec bundle install

Pour faire des installations propres avec bundle install sans erreurs, il faut vider le cache rvm avant de lançer l’instatlation.

$ rm /home/nomuser/.rvm/gems/cache/*

Rvm et ssh

Grâce à la commande rvm --default use 2.4.1 notre système utilise cette version par défaut. Donc à chaque redémarrage on sera opérationel. Ceci est en partie dû à la variable PATH qui a été ajoutée automatiquement par Rvm à la fin de votre fichier de shell .bashrc export PATH="$PATH:$HOME/.rvm/bin" # Add RVM to PATH for scripting Maintenant si on se connecte en ssh et que l’on vérifie la version de ruby ssh courudavancer@monip 'which ruby' on a la surprise de voir que la version de ruby utilisée est celle système ici 2.1.5. Sans rentrer dans les détails on corrige ce comportement en rajoutant la ligne [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function* en haut de votre fichier ~/.bashrc (ou en la déplaçant si elle existe). Il faut la mettre juste avant le return. Pour moi ça donne (Debian Jessie):

 ...
 case $- in
     *i*) ;;
       *)
 	  [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*
 	  return;;
 esac
 ...

Refaites un test ssh et voilà.

Maintenance

On ne doit pas s’étonner si un jour on trouve son dossier ~/home plein et surtout en l’espèce ~/.rvm qui peut monter à plusieurs go. Il faut faire de la place avec rvm.

$rvm cleanup all
Cleaning up rvm archives
Cleaning up rvm repos
Cleaning up rvm src
Cleaning up rvm log
Cleaning up rvm tmp
Cleaning up rvm gemsets
Cleaning up rvm links
Cleanup done.

Maintenant on va supprimer les gemsets donc par conséquent tous les gems installés. Il faudra refaire un bundle install par la suite

$ rvm gemset list
gemsets for ruby-2.4.1 (found in /home/vagrant/.rvm/gems/ruby-2.4.1)
=> (default)
   global

Et on supprime les gemsets à commencer par ‘default’

$ rvm gemset empty default

Enfin on active le cache global pour les gems

$ rvm gemset globalcache enable
Enabling global cache for gems.
Moving the gem cache for ruby-2.0.0-p353 to the global cache.