Outils pour utilisateurs

Outils du site


doc:formations:hebergement:service:gitolite

< Retour à l'index

Repositories git/gitolite

Il s'agit ici d'un objectif double:

  • centraliser ses codes sources, tout en conservant leur historique et variantes
  • rester dans un contexte 100% privé et sous contrôle (par rapport à github par exemple)
  • gérer sans limitation l'accès aux projets pour différents développeurs ayant des droits spécifiques

C'est utile à titre individuel pour développer depuis plusieurs postes (ex. poste fixe et pc portable), mais aussi pour permettre de sous-traiter facilement et sans devoir donner accès à davantage qu'il ne le faut.

L'outil opensource gitolite permet d'imposer ce controle d'accès sous une forme très simple, mais il ne se substitue ni à un bug tracking, ni à un système de "pull request" (soummission contrôlée de modifications par un tiers). Ce n'est donc pas un remplacement d'outils beaucoup plus complexes de gestion de projet tels que github ou gitlab. Mais c'est précisément aussi son intérêt: rester simple et efficace pour de petites équipes.

Principes

git est le système de versioning de source le plus utilisé et probablement le plus performant à l'heure actuelle. Il repose sur une approche distribuée de "patches" (modifications incrémentales) stockés sous forme arborescente.

Voyez cette page pour une introduction progressive et plus précise à l'usage de git.

On appelle un "repository" un lieu commun qui permet à un ou plusieurs développeurs de récupérer et pousser des modifications dans des projets git, mais cette notion même de "dépot" est subjective. En effet, ajouter un ou plusieurs "remote", n'est rien d'autre qu'indiquer un ou plusieurs lieu tiers où se trouvent des *copies* de l'arborescence que l'on a chez soi, qui servent de points de comparaison et d'approvisionnement pour d'autres développeurs. Et précisément, git excelle pour comparer, réconcilier et créer diverses versions d'un projet.

Sans aller hors-sujet, et dans tous les cas, il est utile d'avoir un "dépot central" qui sert de point d'échange principal pour le code source d'un projet. Cela sert aussi comme sauvegarde lorsqu'il se trouve sur un serveur indépendant du poste client.

Enfin, cela sert beaucoup lorsqu'une partie d'une mission doit être soummise à un développeur tiers.

Fonctionnement

Le protocole que nous utilisons ici pour git est SSH (sécurisé et crypté). Mais contrairement à l'habitude, nous n'allons pas donner un accès SSH "habituel" aux développeurs sur le serveur.

En cela, gitolite est une extension intelligente du protocole SSH, qui permet d'intercepter toutes les commandes SSH envoyées, afin de vérifier les droits entrants du développeurs, pour imposer des règles définies simplement, et ne laisser passer que les commandes git habituelles.

:!: de ce fait, les projets git vont être géré indirectement par l'utilisateur associé à gitolite sur le serveur, et seulement lui. Cet utilisateur ne sera pas utilisé interactivement, et encore moins depuis l'extérieur.

Mise en place

Installation

Astuce: sur votre poste client, si besoin, simplifiez-vous l'accès au bon serveur, port et (futur) utilisateur, en ajoutant un alias vers le bon serveur et le bon port dans votre ~/.ssh/config.

On crée maintenant sur le serveur un utilisateur gitolite dédié et on installe le gestionnaires (notez que l'on passe ici par la version la plus récente de https://gitolite.com/gitolite et non la version apt):

ssh root@repos
apt update && apt install git
adduser --system --shell /bin/bash --group --home /home/gitolite gitolite  --gecos 'git handler'
sudo su - gitolite
git clone https://github.com/sitaramc/gitolite
mkdir -p bin .gitolite/logs
gitolite/install -to $HOME/bin
exit
exit

Depuis son poste client, on finalise l'installation, avec sa clé publique SSH (clé d'administrateur gitolite, qui sera nommée ici jeremie.pub, à changer bien sûr pour être plus explicite):

cat ~/.ssh/id_rsa.pub | ssh root@repos 'sudo -H -u gitolite bash -c "cat > /tmp/jeremie.pub; cd /home/gitolite; bin/gitolite setup -pk /tmp/jeremie.pub"'

Configuration initiale

Tout accès SSH sur gitolite@repos est volontairement intercepté par gitolite: ce n'est pas un compte interactif, il ne fera que des opérations git. Par défaut, un accès standard retourne la liste des projets du dépot, avec les droits que l'on a dessus, par exemple:

$ ssh gitolite@repos
hello jeremie, this is gitolite@git.mondomaine.com running gitolite3 v3.6.11-4-gef9ab68 on git 2.17.1

 R W	gitolite-admin
 R W	testing
Connection to files.tecrd.com closed.

Gestion des utilisateurs de gitolite

Au delà de vous-mêmes, vous pourez ajouter/retirer des utilisateurs identifiés par leur clé SSH publique, et leur donner des droits projet par projet.

Cette configuration passe elle-même par git: les changements de configurations seront donc suivies et historisées! Depuis son poste client, on commence par récupérer le projet suivant:

git clone gitolite@repos:gitolite-admin
cd gitolite-admin/

Là se trouvent actuellement seulement deux fichiers:

  • conf/gitolite.conf
  • keydir/jeremie.pub

Le fichier gitolite.conf permet de configurer les droits associés à chacune des clés SSH publiques stockées dans le dossier keydir.

Ajout d'un utilisateur à gitolite

Pour ajouter un utilisateur marcel qui vous aurait donné sa clé SSH publique /tmp/marcel.pub, on l'ajoute d'abord dans le repository gitolite (sur votre poste, pas sur le serveur) :

cp /tmp/marcel.pub keydir/
git add keydir
git commit -m "ajout de marcel"
git push origin master

Mais jusque là, il n'aura pas davantage de droits sur les projet git!

Configuration des droits des utilisateurs

Pour lui donner un droit de lecture seule et sur un projet nommé prj pour lequel vous auriez un accès complet, il faudra ajouter ou modifier le paragraphe correspondant dans le fichier conf/gitolite.conf, et le soummettre par git:

repo gitolite-admin
    RW+     =   jeremie

repo testing
    RW+     =   @all

repo prj
    RW+ = jeremie
    R   = marcel

Note: le fait de pousser cette modification de gitolite.conf va initialiser le projet du coté du serveur. Il suffira donc d'un simple git clone gitolite@repos:prj pour le récupérer localement.

La logique simple de gitolite implique que pour ajouter un utilisateur, ou configurer ses droits il suffit d'avoir soi-même le droit d'écriture sur sur le projet gitolite: pour marcel, ce serait fait avec la modification de ce paragraphe:

repo gitolite-admin
    RW+     =   gitolite
    RW+     =   marcel

Des droits complexes sont possibles avec gitolite, comme la gestion groupée ou l'interdiction pour une personne de faire un push sur la branche master (voyez cette section par exemple).

Création d'un projet

Nouveau projet

Pour créer un nouveau projet, il faut d'abord le déclarer dans gitolite-admin/conf/gitolite.conf, avec les droits associés:

repo <REPONAME>
    RW+ = jeremie

Projet local à importer dans gitolite

S'il existe déjà, ou bien si l'on a créé le projet côté client, par exemple:

mkdir REPONAME
cd REPONAME
git init
git add .
git commit -m 'initial commit' -a

Alors il faut le rattacher au serveur gitolite:

git remote add origin gitolite@repos:REPONAME
git push origin master

Si le remote existe déjà, pensez à git remote rename origin gitolite@repos:REPONAME (voir la documentation/aide git).

Import de dépots existants dans gitolite

(source)

Il est possible et utile d'intégrer directement des dépots existants sous gitolite, en les copiant directement sur le serveur dans le dossier /home/gitolite/repositories.

Il faut vérifier que chacun des nom de projets finit bien avec l'extension .git .

Puis vérifier les droits de ces fichiers: sudo chown -R gitolite:gitolite /home/gitolite/repositories

Ensuite on les notifie à gitolite:

sudo su - gitolite
gitolite compile
gitolite setup --hooks-only
gitolite trigger POST_COMPILE

Et finalement, il faudra ajouter un paragraphe associé à chaque projet dans conf/gitolite.conf, avec les droits attendus.

Annexe

Remarque importante sur les noms de clés SSH

:!: Si vous rencontrez des problèmes pour faire reconnaitre un utilisateur, il y a une caractéristique à savoir, parfois vicieuse, dans la gestion des clés SSH par gitolite: si la clé de l'utilisateur est sous la forme "joe@fqdn" et que "fqdn" est bien un FQDN valide (nom de domaine internet complet et valable), alors il faut spécifier le nom "joe@fqdn" dans le fichier gitolite.conf. C'est-à-dire que "joe@here.or.there" sera valide là où "joe@here" ne l'est pas!

Dans le cas d'un email mal formé, on peut cependant spécifier l'utilisateur par son nom seulement ("joe" ici, mais ce n'est pas idéal). Explications ici ("l'idée du @suffix est de permettre à l'administrateur d'ajouter facilement plusieurs clés pour un même utilisateur").

Configuration coté client de son .ssh/config pour gitolite

A propos de SSH, voyez les bénéfices de configurer votre $HOME/.ssh/config sur la page ssh.

Usage de git

C'est (pour le moment) hors sujet par rapport à ce guide.

Mentionnons seulement quelques éléments utiles à mettre dans son ~/.gitconfig:

[merge]
  tool = meld
  ff = no
  commit = no

[color]
  ui = true

[color "status"]
  changed = red bold
  untracked = red bold
  added = green bold

[alias]
  loga = log --all --decorate --oneline --graph
  d = difftool -y

Dans son "prompt" unix, on peut aussi ajouter la branche sur laquelle on travaille, c'est pratique pour éviter les erreurs de manupipulation. Pour cela on peut modifier ou ajouter cette ligne dans son ~/.bashrc:

PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[00;32m\] \w\[\033[01;30m\]$(__git_ps1)\[\033[00m\]\n\$ '
doc/formations/hebergement/service/gitolite.txt · Dernière modification : 2022/08/09 09:03 de jeremie