{{indexmenu_n>200}}
====== 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