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
Sur le serveur de destination
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
Sur Gitlab
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.
Runner local
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