Comment utiliser Rsync et SSH dans un pipeline GitLab CI dockerisé – CloudSavvy IT


Graphique montrant le logo GitLab, une tête de renard stylisée

rsync est un utilitaire de synchronisation de fichiers populaire qui utilise un algorithme efficace pour minimiser la consommation de bande passante. L’un des rôles courants de rsync consiste à déployer une construction de site Web sur un serveur de production distant. Voici comment combiner la polyvalence de rsync avec l’automatisation fournie par les pipelines GitLab CI.

Exécuteurs de pipeline

GitLab CI prend en charge plusieurs types d’exécuteurs de pipeline. Ceux-ci définissent l’environnement dans lequel votre travail s’exécutera. Le shell l’exécuteur est la valeur par défaut et s’exécute sans système d’exploitation sur la machine hôte. Il permet à vos pipelines d’utiliser n’importe quelle commande disponible sur l’hôte sans autre configuration. Comme la plupart des distributions Linux populaires sont livrées avec rsync installé, cette approche est facile à maîtriser.

Malheureusement, le shell exécuteur ne fournit pas une isolation forte et peut polluer l’environnement de votre hôte au fil du temps. Une meilleure alternative est la docker exécuteur, qui lance un nouveau conteneur Docker pour chaque tâche CI. Toutes les tâches s’exécutent dans un environnement propre qui ne peut pas avoir d’impact sur l’hôte.

L’inconvénient ici est que les images de base Docker n’incluent généralement pas rsync ou alors ssh. Même les images officielles du système d’exploitation comme ubuntu:latest expédier en tant que versions minimales sans ces commandes. Cela crée un script de pipeline légèrement plus impliqué pour ajouter les dépendances et rsync vos fichiers.

Voici comment ajouter rsync à votre pipeline. Assurez-vous que vous disposez d’un GitLab Runner basé sur Docker avant de continuer. Nous supposerons également que vous avez un projet GitLab prêt à l’emploi.

Se préparer

Vous aurez besoin d’une paire de clés SSH disponible si vous utilisez rsync pour vous connecter à un hôte SSH distant. Vous pouvez générer des clés publiques et privées en exécutant ssh-keygen -t rsa. Copier la clé publique au serveur auquel vous vous connecterez.

Ensuite, copiez la clé privée générée dans votre presse-papiers :

cat ~/.ssh/id_rsa | xclip -selection c

Dirigez-vous vers votre projet GitLab et cliquez sur « Paramètres » en bas du menu de navigation de gauche. Cliquez sur l’élément « CI/CD » dans le sous-menu. Faites défiler jusqu’à la section « Variables » sur la page résultante.

Cliquez sur le bouton bleu « Ajouter une variable ». Donnez un nom à votre nouvelle variable dans le champ « Clé ». Nous utilisons SSH_PRIVATE_KEY. Collez votre clé privée dans le champ « Valeur », y compris le premier ----BEGIN et traînant -----END lignes.

L’ajout de la clé en tant que variable CI vous permet de la référencer ultérieurement dans votre pipeline. Il sera ajouté à l’agent SSH dans les conteneurs créés par votre pipeline.

Ajout de votre fichier de pipeline

GitLab CI exécute des tâches basées sur le contenu d’un .gitlab-ci.yml fichier dans votre référentiel. GitLab trouvera automatiquement ce fichier et exécutera le pipeline qu’il définit lorsque vous appliquerez des modifications à vos branches.

deploy:
  stage: deploy
  image: alpine:latest
  script:
    - rsync -atv --delete --progress ./ user@example.com:/var/www/html

Ce .gitlab-ci.yml contient un travail qui utilise rsync pour synchroniser le contenu du répertoire de travail avec /var/www/html sur le example.com serveur. Il utilise le alpine:latest Image Docker comme environnement de construction. Le pipeline échouera actuellement car rsync n’est pas inclus dans l’image Alpine.

Installer SSH et rsync

Alpine est une bonne base pour le travail car c’est une image légère avec peu de dépendances. Cela réduit l’utilisation du réseau pendant que GitLab extrait l’image au début du travail, accélérant ainsi votre pipeline. Pour que rsync fonctionne, ajoutez SSH et rsync à l’image, puis démarrez l’agent SSH et enregistrez la clé privée que vous avez générée précédemment.

deploy:
  stage: deploy
  image: alpine:latest
  before_script:
    - apk update && apk add openssh-client rsync
    - eval $(ssh-agent -s)
    - echo "$SSH_PRIVATE_KEY" | ssh-add -
  script:
    - rsync -atv --delete --progress ./ user@example.com:/var/www/html

OpenSSH et rsync sont installés à l’aide d’Alpine apk directeur chargé d’emballage. L’agent d’authentification SSH est démarré et votre clé privée est ajoutée via ssh-add. GitLab injecte automatiquement le SSH_PRIVATE_KEY variable d’environnement avec la valeur que vous avez définie dans les paramètres de votre projet. Si vous avez utilisé une clé différente sur l’écran des variables GitLab, assurez-vous d’ajuster votre pipeline en conséquence.

Gestion de la vérification de l’hôte

SSH vous invite de manière interactive à confirmer la première fois que vous vous connectez à un nouvel hôte distant. Ceci est incompatible avec l’environnement CI, où vous ne pourrez pas voir ou répondre à ces invites.

Deux options sont disponibles pour résoudre ce problème : Désactivez les vérifications strictes des clés d’hôte ou enregistrez votre serveur en tant qu’hôte « connu » à l’avance.

Pour la première option, ajoutez la ligne suivante à votre pipeline before_script:

- echo "Host *ntStrictHostKeyChecking no" >> ~/.ssh/config

Bien que cela fonctionne, il s’agit d’un risque potentiel pour la sécurité. Vous n’auriez aucun avertissement si un attaquant prenait le contrôle du domaine ou de l’IP de votre serveur. L’utilisation de la vérification de la clé de l’hôte vous permet de vérifier que l’identité de la télécommande correspond à ce que vous attendez.

Vous pouvez ajouter la télécommande en tant qu’hôte connu de manière non interactive en vous y connectant sur votre propre machine en dehors de votre pipeline. Inspectez votre ~/.ssh/known_hosts et recherchez la ligne contenant l’adresse IP ou le nom d’hôte de la télécommande. Copiez cette ligne et utilisez la procédure précédente pour ajouter une nouvelle variable GitLab CI. Nommez cette variable SSH_HOST_KEY.

Maintenant, mettez à jour votre before_script section avec la ligne suivante :

- echo "$SSH_HOST_KEY" > ~/.ssh/known_hosts

Désormais, vous pourrez vous connecter au serveur sans recevoir d’invite de confirmation. Envoyez votre code dans votre référentiel GitLab et observez la fin de votre pipeline.

Autres améliorations

Ce pipeline est un exemple simple de démarrage avec SSH et rsync dans un environnement Dockerisé. Il existe des possibilités d’améliorer encore le système en enveloppant les étapes de préparation dans une étape de construction dédiée qui construit une image Docker que vous pouvez réutiliser entre les pipelines.

Le .gitlab-ci.yml bénéficierait également d’une plus grande utilisation des variables. Résumé du nom d’hôte du serveur distant (example.com), répertoire (/var/www/html) et l’utilisateur (user) dans les variables GitLab CI aiderait à garder le fichier propre, empêcherait les navigateurs de référentiel occasionnels de voir les détails de l’environnement et vous permettrait de modifier les valeurs de configuration sans modifier votre fichier de pipeline.

Résumé

L’utilisation de rsync dans les pipelines GitLab CI nécessite une petite configuration manuelle pour former un environnement de construction doté des dépendances dont vous avez besoin. Vous devez injecter manuellement une clé privée SSH et enregistrer le serveur distant en tant qu’hôte connu.

Bien que des images Docker de la communauté soient disponibles et roulent SSH et rsync sur des images de base populaires, elles vous donnent finalement moins de contrôle sur votre build. Vous étendez la chaîne d’approvisionnement de votre pipeline avec une image à laquelle vous ne pouvez pas nécessairement faire confiance. Commencer par une image de base du système d’exploitation et ajouter ce dont vous avez besoin vous aide à avoir confiance en vos builds.



Vous pouvez lire l’article original (en Angais) sur le blogwww.cloudsavvyit.com