Intégration continue Gitlab
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