Installer Gitorious avec RVM

Introduction

Il y a quelques temps, je me suis lancé dans l’installation de Gitorious. Celle-ci n’est pas évidente (mais je ne suis pas très familier des déploiements d’applications Ruby on Rails).

Heureusement, pour palier à cette complexité, il existe un certain nombre de ressources pour aider. Voici donc une liste de liens qui m’ont aidé :

  • Sur Bitnami, il est possible de se procurer des images « prêtes à l’emploi », dont Gitorious (parfaites pour tester le programme, mais qui ne sont pas recommandées pour la production).
  • Des recettes Chef sont disponibles, pour automatiser l’installation.
  • Sur le site officiel, plusieurs guides d’installation en fonction de l’environnement.

En particulier, ce tutoriel est beaucoup plus simple que la version originale. C’est donc à partir de cet article que j’ai monté mon installation de Gitorious, avec quelques adaptations, que je me propose de partager ici, en espérant qu’elles aideront ceux qui veulent se lancer dans l’installation de Gitorious.

Rapidement, voici les modifications que je présenterai ici :

  • L’installation a été réalisée sur une Ubuntu Server 12.04 LTS.
  • Au lieu d’utiliser les paquets natifs, tout ce qui touche à Ruby sera géré par RVM, qui offre l’avantage de permettre de combiner comme on le souhaite plusieurs versions de Ruby et de gems, sans être limité par les versions disponibles dans le gestionnaire de paquets.
  • Les répertoires d’installations ne sont pas ceux du tutoriel.

Avertissement avant d’aller plus loin : n’étant ni développeur Ruby, ni administrateur système, il est possible que certains choix d’installation ou de configuration que je vais présenter ne soient pas recommandés. Dans ce cas, je vous remercierai d’apporter des précisions en commentaires.

Les packages système

Afin de réaliser cette installation, il faut un certains nombre de paquets système que nous installons grâce au gestionnaire de paquets :

1
2
3
4
5
sudo apt-get install build-essential
sudo apt-get install git-core
sudo apt-get install git-svn
sudo apt-get install git-cvs
sudo apt-get install git-doc

Petite précision avec git : attention à la tentation d’installer le paquet git-all. Celui-ci installe et démarre git-daemon. Si celui-ci est installé, il faut l’arrêter. Il sera configuré et démarré directement par les scripts de démarrage de Gitorious.

1
2
3
4
5
6
7
8
9
10
11
12
13
# Système de cache utilisé par Gitorious
sudo apt-get install memcached
# Nécessaire à la compilation des gems utilisées par MySQL
sudo apt-get install libmysqlclient-dev
sudo apt-get install libssl-dev
# Nécessaire pour l'installation des gems
sudo apt-get install zlib1g zlib1g-dev
# Librairie RMagick (traitement des images)
sudo apt-get install libmagick++-dev
# Nécessaire à la compilation de la gem Nokogiri
sudo apt-get install libxslt1-dev
# Librairie nécessaire à Passenger (Nginx)
sudo apt-get install libcurl4-openssl-dev

Si vous oubliez certains de ces paquets, il sera toujours temps de les réinstaller au moment où ils seront nécessaires.

Moteur de recherche Sphinx

Le tutoriel original utilise la version 0.9.9 du moteur. Cependant, j’ai pu vérifier qu’utiliser une version plus récente n’avait pas d’incidence sur le bon fonctionnement de l’ensemble. Ci-après donc, le code permettant d’installer la dernière version (2.0.5) à la date de cet article :

1
2
3
4
5
wget http://sphinxsearch.com/files/sphinx-2.0.5-release.tar.gz
tar -xzvf sphinx-2.0.5-release.tar.gz
cd sphinx-2.0.5-release
./configure --prefix=/usr
sudo make all install

Installation de MySQL et création de la base Gitorious

1
2
sudo apt-get install mysql-server
mysql -u root -p

Une fois connecté, exécuter les commandes (avec le nom de base, d’utilisateur et le mot de passe de votre choix) :

1
2
3
4
CREATE DATABASE gitorious_production;
CREATE USER gitorious@'localhost' IDENTIFIED BY 'gitorious';
GRANT ALL PRIVILEGES ON gitorious_production.* TO gitorious@'localhost' IDENTIFIED BY 'gitorious';
FLUSH PRIVILEGES;

Utilisateur git et arborescence

Petite variante par rapport au tutoriel original : je préfère séparer les données du répertoire de l’application web. Le « home » de l’utilisateur est donc placé dans « /var/git » (mais « /home/git » fonctionne très bien également pour ceux qui préfèrent). De même, l’emplacement d’installation de gitorious n’a rien d’impératif (« /opt/gitorious » est un autre choix possible, par exemple).

1
2
3
4
5
6
7
8
9
10
11
sudo adduser --system --home /var/git --no-create-home --group --shell /bin/bash git
sudo chown -R git:git /var/www/gitorious
sudo su - git
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
mkdir tmp/pids
mkdir repositories
mkdir tarballs
mkdir tarballs-work

Installation de RVM

Plutôt que d’installer RVM de manière globale pour le système, j’ai préféré l’installer localement pour l’utilisateur git. Cela évite par ailleurs d’avoir à créer un gemset spécifique, et je peux donc me contenter d’utiliser celui par défaut.

Avec l’utilisateur git, exécuter :

1
curl -L https://get.rvm.io | bash -s stable

Une fois RVM chargé (au besoin, en chargeant le script grâce aux fichiers « .profile » ou « .bashrc ») :

1
rvm install 1.8.7

Il est normalement possible de remplacer la version standard « 1.8.7 » par la version enterprise « ree-1.8.7 », plus performante, mais je n’ai pas testé cette version.

Passons maintenant aux premières gems nécessaires :

1
2
3
4
rvm install rubygems 1.4.2
gem install --no-ri --no-rdoc -v 0.8.7 rake
gem install --no-ri --no-rdoc -v 1.1.0 daemons
gem install --no-ri --no-rdoc rmagick stompserver passenger bundler

Je recommande fortement cette version 1.4.2 de rubygems. Elle est ancienne, mais évite d’avoir à s’occuper du problème d’incompatibilité entre les versions plus récentes et la version de Rails utilisée par Gitorious (je n’ai pas réussi à faire fonctionner la résolution « require thread » mentionnée dans le tutoriel original).

Installation de Gitorious

1
2
3
4
5
6
7
8
9
sudo git clone git://gitorious.org/gitorious/mainline.git /var/www/gitorious/
# Ou si le protocole "git" est bloqué par un proxy quelconque :
# sudo git clone https://git.gitorious.org/gitorious/mainline.git /var/www/gitorious/
sudo chown -R git:git /var/www/gitorious
cd /var/www/gitorious
git submodule init
git submodule update
bundle install
bundle pack

Note : plutôt que d’utiliser la branche « master », pas toujours stable, je me suis basé sur le tag d’une version stabilisée pour réaliser ce guide (en l’occurence, la version v2.2.1)

Configuration

Copier et configurer les fichiers suivants (en supprimant le « .example » final) :

  • /var/www/gitorious/config/broker.yml.example
  • /var/www/gitorious/config/database.yml.example
  • /var/www/gitorious/config/gitorious.yml.example
Dans « database.yml », on configure la connexion à la base de données préalablement créée.
Dans « gitorious.yml », on vérifie les propriétés suivantes (en configuration de production) :
  • repository_base_path doit pointer vers « /var/git/repositories"
  • cookie_secret doit être une chaîne aléatoire de plus de 30 caractères
  • gitorious_client_port devrait être 80
  • gitorious_host doit être le nom d’hôte de la machine
  • archive_cache_dir doit pointer vers « /var/git/tarballs"
  • archive_work_dir doit pointer vers « /var/git/tarballs-work"
  • hide_http_clone_urls doit être à « true » (les URL http ne fonctionnent pas « out of the box »)
  • is_gitorious_dot_org doit être à « false »
D’autres options de ce fichier sont intéressantes (en particulier la possibilité récemment apportée d’avoir des dépôts privés. Il est également possible d’utiliser le modèle authentication.yml.example pour utiliser une identification LDAP en remplacement du mécanisme par défaut.

 

Lors de mon installation, j’ai dû modifier le fichier « /var/www/gitorious/config/ultrasphinx/production.conf », en remplaçant « base_tags » par « tags ». [Mise à jour] Cette action n’est plus nécessaire avec la version v2.2.1.

Initialisation de la base de données

On crée la structure de la base de données :
1
2
3
4
export RAILS_ENV=production
bundle exec rake db:create
bundle exec rake db:migrate
bundle exec rake ultrasphinx:bootstrap
Afin de simplifier le (re)démarrage des service, il est une bonne idée de faire en sorte que l’environnement « RAILS_ENV » de production soit pris en compte automatiquement à l’ouverture de session (« .profile », « .bashrc », ou équivalent).
Et on crée l’utilisateur administrateur Gitorious :
1
ruby /var/www/gitorious/script/create_admin

Scripts de démarrage

On commence par copier les templates fournis par Gitorious.

1
sudo cp /var/www/gitorious/doc/templates/ubuntu/* /etc/init.d/

Dans ces templates, on modifie les chemins par défaut qui ne sont pas les bons. En particulier :

  • « GITORIOUS_HOME » prend la valeur  »/var/www/gitorious »
  • « RUBY_HOME » prend la valeur « /var/git/.rvm/rubies/ruby-1.8.7-p358 »
  • « GEMS_HOME » prend la valeur « /var/git/.rvm/gems/ruby-1.8.7-p358 »
De plus, on remplace les appels à la commande « ruby » par « bundle exec » (lancé depuis le répertoire « $GITORIOUS_HOME », afin que les bonnes versions de gems soient utilisées.
Par exemple, dans le script git-poller on remplace la commande de lancement comme suit :
1
2
3
4
5
# Commande originale
# GIT_POLLER="$RUBY_HOME/bin/ruby $GITORIOUS_HOME/script/poller"
 
# Commande pour RVM
GIT_POLLER="cd $GITORIOUS_HOME && $GEMS_HOME/bin/bundle exec $GITORIOUS_HOME/script/poller"
Les commandes de chacun des scripts doivent être mises à jour de la même façon. Une fois les fichiers mis en conformité avec l’environnement, on configure le lancement des services au démarrage :
1
2
3
4
5
cd /etc/init.d/
sudo update-rc.d git-daemon defaults
sudo update-rc.d git-poller defaults
sudo update-rc.d git-ultrasphinx defaults
sudo update-rc.d stomp defaults

Enfin, on planifie l’indexation du contenu pour le moteur de recherche Sphinx, dans la crontab de l’utilisateur :

1
* * * * * RAILS_ENV=production && cd /var/www/gitorious && bundle exec rake ultrasphinx:index

Enfin, on crée un alias utilisable partout de la commande gitorious (qui sera utilisée par le « hook » lors de la publication de commits) :

1
sudo ln -s /var/www/gitorious/script/gitorious /usr/bin/gitorious

Configuration du serveur web

Pour servir l’application, j’utilise Passenger, en mode standalone. L’installation est très simple :

1
2
gem install passenger
passenger start -p 80

Pour mettre Gitorious en place, plusieurs options sont disponibles :

  • Utiliser Nginx ou Apache en reverse-proxy devant passenger (qu’on configure dans ce cas pour écouter sur localhost uniquement et sur un port différent).
  • En installant directement le module passenger pour Nginx ou Apache.

Todo

Normalement, à ce stade, nous avons un serveur Gitorious en état de marche !

J’espère maintenant avoir l’occasion d’aller plus loin sur plusieurs points (qui me donneront peut-être l’occasion de compléter cet article) :

  • Utiliser https au lieu de http
  • Faire fonctionner les adresses de clonage en http(s)

À propos de Benoît Courtine

Open Source enthousiast, and CTO at Alcion Group.
Ce contenu a été publié dans Systèmes d'information, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*