Intégration continue Gitlab

Pour l'intégration continue, l'utilisateur pour les clés SSH est acainformatique, voir le mot de passe dans keeweb

Se connecter au serveur qui doit recevoir le code et vérifier que le fichier ~/.ssh/id_ecdsa existe.

Si le fichier n'existe pas, générez le :

ssh-keygen -b 521 -t ecdsa

Vérifiez que le fichier ~/.ssh/authorized_keys existe. Le cas échéant, créez le en copiant le fichier id_ecdsa.pub :

cp ~/.ssh/id_ecdsa.pub ~/.ssh/authorized_keys

Ou ajoutez le contenu de id_ecdsa.pub dedans si ce n'est pas déjà le cas :

cat ~/.ssh/id_ecdsa.pub >> ~/.ssh/authorized_keys

Dans certains cas, il est nécessaire d'assigner les permissions en lecture seule :

chmod 600 ~/.ssh/authorized_keys

Allez dans dans le projet puis Settings / Repository puis ajouter dans Deploy Keys le contenu du fichier id_ecdsa.pub du serveur de destination.

Toujours dans le projet, allez dans Settings / CI/CD / Variables .Ajoutez une variable DEPLOY_KEY et collez le contenu du fichier id_ecdsa que vous avez généré (ou récupéré) du serveur de destination.

Ajoutez également une variable SERVER_USER contenant l'utilisateur SSH du serveur et une variable SERVER_HOSTNAME contenant le nom du serveur.

Pour finir ajouter une variable PROJECT_PATH contenant le chemin vers la racine du projet sur le serveur de destination.

A la racine du projet, créez un fichier .gitlab-ci.yml et mettez y par exemple :

image: kroniak/ssh-client:latest

stages:
   - deploy

before_script:
    - mkdir -p ~/.ssh
    - echo -e "$DEPLOY_KEY" > ~/.ssh/id_ecdsa
    - chmod 600 ~/.ssh/id_ecdsa
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
           
production:
    stage: deploy
    script:
        - ssh $SERVER_USER@$SERVER_HOSTNAME "cd $PROJECT_PATH &&
            git checkout . &&
            git checkout master &&
            git pull"
    only:
        - master
    environment: production

Ceci va exécuter le job de mise à jour du projet sur le serveur de production. A noter que dans cet exemple cela se fait uniquement à la mise à jour de la branche master.

Pour l'installation : https://docs.gitlab.com/runner/install/linux-repository.html

Attention : Installer le runner en tant que root, sélectionner docker comme mode d'utilisation

En cas de runner local utilisant docker sur le serveur distant, il est possible de conserver le même script à la différence qu'il faut récupérer l'ip de la machine host. Cela permet de filtrer le port 22 par ip en déclarant la plage d'ip de docker.

Dans le fichier .gitlab-ci.yml on va ajouter une ligne dans before_script puis modifier l'appel ssh pour utiliser l'ip du host qu'on récupère :

before_script:
    ...
    - export HOST_IP=$(/sbin/ip route|awk '/default/ { print $3 }')

script:
    - ssh $SERVER_USER@$HOST_IP ...

Iptables

Facultatif : on ajoute sur le serveur la règle qui autorise l'accès aux adresses ip des hosts docker :

iptables -I INPUT -s 172.0.0.0/8 -j ACCEPT

En cas de blocage des autres ports :

# Docker
iptables -I INPUT -s 172.0.0.0/8 -j ACCEPT      # Docker
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
iptables -t filter -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
iptables -t filter -A FORWARD -i docker0 -o docker0 -j ACCEPT
  • Dernière modification: 06/12/2021 14:57