Avertissement : ce guide s'adresse à des lecteurs qui savent ce qu'est Subversion. Des lecteurs qui ne sauraient pas pourront peut-être y trouver un intérêt, mais c'est pas dit.
Enoncé du problème
Je développe un site web pour un client, disons www.monsite.com. D'après le dimensionnement et l'usage que ce client prévoit, je lui recommande un hébergement mutualisé 60gp chez OVH. Pour le développement du site, je travaille en équipe, et nous gérons le code du site sous Subversion, sur un autre hébergement, chez OVH ou pas; disons que l'URL du repository Subversion est http://svn.maboite.fr/monsite. Comme il est de
coutume dans ce genre d'architecture, nous voulons gérer la mise à jour du site en prod www.monsite.com par Subversion, en faisant du code sur www.monsite.com une simple "working copy" du repository Subversion. Le problème est : comment exécuter la commande "svn update" depuis le 60gp ?
Etape 1 : comment exécuter une commande sur un 60gp, qui n'a pas d'accès SSH ?
La réponse est simple : on fait une page PHP (p.ex.) qui appelle exec() ou une autre fonction de la même famille. Bien entendu, on ne s'amuse pas à laisser une telle page en accès libre.
Etape 2 : les commandes client Subversion ne sont pas disponibles sur un 60gp.
On peut les installer en local (voir les conditions générales). Pour ça, la démarche naturelle est d'aller sur
http://subversion.tigris.org/project_packages.html. On s'aperçoit alors qu'il n'y a pas de distribution binaire du seul côté client de Subversion. Et que si on veut installer des binaires sur son 60gp, ça serait bien de connaître la plateforme (architecture, distrib Linux, etc.) sur laquelle le 60gp est hébergé.
Etape 3 : trouver sur quelle distrib le 60gp est hébergé.
Après une recherche dans les pages d'aide et les forums de OVH, je n'ai pas trouvé de réponse complète. J'ai trouvé qu'il s'agissait d'une architecture i386, probablement une distrib Gentoo. Mais il n'y a pas de distrib Gentoo sur le site de Subversion, et
http://www.gentoofr.org/ nous explique que Gentoo est une méta-distribution, ce qui montre qu'on n'est pas rendu.
En discutant avec un collègue, j'apprends qu'il existe dans de nombreuses distribs Linux un fichier /etc/{redhat,fedora,etc.}-release. A tout hasard, je lance un "ls /etc" (par la méthode décrite à l'étape 1), et je vois qu'il existe un fichier /etc/debian_release. La distrib est donc une Debian.
Etape 4 : trouver une distrib Debian de Subversion.
Sur le site de Subversion, on lit pour Debian : "Just run 'apt-get install subversion'." Oui mais non : je ne veux pas installer Subversion (en plus pas en entier) sur la machine, je veux juste récupérer l'exécutable de la partie client et la mettre sur mon 60gp.
On lit aussi : "Information on the latest official packages can be found here:
http://packages.debian.org/subversion." Je m'y rends donc. Je choisis naturellement une version stable, puis i386, puis un mirroir près de chez moi, et je me retrouve avec un fichier subversion_1.4.2dfsg1-2_i386.deb, dans lequel j'imagine qu'il y a mon bonheur.
Etape 5 : aller regarder dans un fichier ".deb".
Wikipedia nous aide ici, en nous
apprenant qu'un package Debian est une archive au format Unix "ar", dans laquelle les fichiers à installer sont dans un "data.tar.gz". Je n'ai pas de distrib Debian sous la main, mais j'ai une machine Unix à portée, sur laquelle je déballe le ".deb" puis le "data.tar.gz". (A défaut, on peut uploader le ".deb" sur le 60gp et le déballer à distance par la méthode décrite à l'étape 1.) Je vois effectivement dedans un fichier "svn" dans un répertoire "usr/bin".
Etape 6 : récupérer les bibliothèques
Car quand on uploade le fichier "svn" sur le 60gp et qu'on cherche à exécuter "svn --version" pour vérifier que ça marche, on s'aperçoit qu'il lui manque des bibliothèques. Ce n'est pas pour rien que la page de download du package Debian parlait de dépendances... On va donc devoir répéter pour chaque bibliothèque manquante la manip : recherche + download du package + déballage + upload de la lib.
Etape 7 : comment savoir quelles sont les bibliothèques manquantes ?
Il y a deux approches : soit on fait la fermeture transitive des dépendances entre packages, à partir des informations sur le site Debian; soit on regarde dans le message d'erreur au lancement de "svn --version", qui nous donne la première bibliothèque manquante, on la récupère, et on recommence juqu'à ce que ça marche. Pour ma part j'ai suivi la seconde approche.
Etape 8 : faire en sorte que les bibliothèques récupérées soient prises en compte
Le système d'exécution des binaires sous Linux utilise la notion de "library path", c'est-à-dire une liste de répertoires dans lesquels le système ira chercher les bibliothèques requises par un exécutable. On indique ce "library path" en donnant une valeur à la variable d'environnement LD_LIBRARY_PATH. J'ai donc fait les choses suivantes :
- j'ai créé, à la racine de mon compte "monsite", un répertoire "bin" dans lequel j'ai mis l'exécutable "svn", et un répertoire "lib" dans lequel je mettrai les bibliothèques
- j'ai écrit le script shell suivant que j'ai mis dans "bin/svn.sh" et auquel j'ai donné les droits en exécution
#!/bin/sh
LD_LIBRARY_PATH=/home/monsite/lib:/usr/lib
PATH=/home/monsite/bin:$PATH
export LD_LIBRARY_PATH PATH
exec svn "$@"
Ce script positionne le "library path" en le fixant au répertoire "lib" que je viens de créer, et y ajoute le répertoire commun "/usr/lib" où il y a déjà un certain nombre de bibliothèques. Ca m'évitera de récupérer des bibliothèques qui seraient déjà installées sur le serveur.
Etape 9 : récupérer les bibliothèques
Quand j'exécute "bin/svn.sh --version", je reçois un message d'erreur m'indiquant qu'il manque la bibliothèque "libsvn_client-1.so.1". Je retourne sur le
site Debian, où je vois parmi les dépendances un package "libsvn1" (d'après le nom du package Subversion que j'ai déjà récupéré, je choisis celui pour la 1.4.2) que je récupère. En le déballant, je trouverai effectivement un fichier "libsvn_client-1.so.1", que j'uploade dans le répertoire "lib". Puis je répète la manip, jusqu'à ce que ça marche. Pour ma part j'ai ainsi récupéré et uploadé 18 bibliothèques.
Etape 10 : enjoy
Il faut savoir savourer le plaisir d'un problème résolu...