{{indexmenu_n>200}} ====== Intégration continue Gitlab ====== Pour l'intégration continue, l'utilisateur pour les clés SSH est ''acainformatique'', voir le mot de passe dans [[https://keeweb.app.local|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