Utiliser GitHub comme miroir d'un GitLab auto-hébergé

Coucou cher journal de toile,

Je souhaite me passer un peu de GitHub. J'y vais en douceur, mais GitLab ♥ m'y aide bien, en tant qu'alternative fort crédible.

J'ai voulu migrer mon dépôt de rôles ansible de GitHub vers mon GitLab auto-hébergé.

Pour aller progressivement, et ne pas mettre tous mes œufs dans le même panier, je souhaite conserver un miroir de mon dépôt sur GitHub, même si je ne ferais désormais plus de push que via le GitLab.

Aperçu de la solution

On va utiliser tout simplement le hook git post-receive pour exécuter un script à chaque push sur le dépôt géré par GitLab. Ce script se chargera de faire un push du code reçu vers GitHub.

Il faudra évidement avoir autorisé notre GitLab à pusher en SSH sur le dépôt GitHub.

Côté GitLab

NB: J'ai installé GitLab via les paquetages omnibus. Les dépôts sont gérés par l'utilisateur Unix git et stockés dans /var/opt/gitlab/git-data/. Vous pouvez adapter ces valeurs à votre installation.

Il faut commencer par créer une clef SSH à l'utilisateur git :

$ sudo -u git ssh-keygen

Les valeurs par défaut font l'affaire. Pour permettre l'automatisation, il faut laisser la passphrase vide.

Ajouter un remote vers GitHub (substituer <namespace> et <repo>, évidemment).

$ cd /var/opt/gitlab/git-data/<namespace>/<repo>.git
$ sudo -u git git remote add --mirror github
git@github.com:<namespace>/<repo>.git

Il faut ensuite créer le hook à proprement parler :

$ sudo -u git mkdir custom_hooks
$ sudo -u git echo "exec git push --quiet github &" >> post-receive
$ sudo -u git chmod 755 post-receive

Nous pouvons ensuite passer de l'autre côté du miroir…

Côté GitHub

Sur l'interface web de GitHub, pour le dépôt concerné, se rendre dans les Settings, puis Deploy keys, et ajouter une deploy key, en y collant le contenu du fichier /var/opt/gitlab/.ssh/id_rsa.pub issu du serveur GitLab, (cocher Allow write Access, afin de donner au GitLab les droits de push).

Tester le tout

Il y a une dernière étape à effectuer depuis le serveur GitLab : vérifier et accepter la clef SSH du serveur de GitLab :

$ sudo -u git ssh git@github.com

The authenticity of host 'github.com (192.30.252.130)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added 'github.com,192.30.252.130' (RSA) to the list of known hosts.
PTY allocation request failed on channel 0
Hi namespace/repo! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

Cela permet de valider au passage que la clef est bien autorisée au niveau de GitHub.

Pour tester "en vrai", il suffit de réaliser un push vers le dépôt hébergé sur GitLab, et vérifier que les nouveaux commits sont bien apparus sur le dépôt GitHub.

Chez moi, ça marche.

NB: les procédures détaillées n'utilisent que des outils standard, et sont adaptables aisément avec des outils autres que GitHub et GitLab.

Ressources