Deploy docker & gitlab
Cette partie définit un pipeline CI/CD pour un deploiement automatique de vos applications Docker avec GitLab. Il permet le déploiement automatique de vos images docker sur votre serveur via Docker Swarm. Ce pipeline est configuré pour être exécuté uniquement sur la branche main.
Initialisation
Dans un premier temps il vous faudra un serveur avec docker d'installer dessus, ensuite il faudra initialiser un docker swarm sur ce serveur si ce n'est pas déja fait, via la commande :
docker swarm init
Variables
Comme pour le précédent tuto il faudra mettre des variables gitlab en place :
IP_SERVE
→Ip de votre serveur
USER_SERVE
→Nom d'utilisateur du serveur
SSH_PRIVATE_KEY
→Clé privée rsa qui permet l'authentification sur le serveur
(la récupéré en base 64)
cat id_rsa | base64
Mise en place
Connecter vous sur votre serveur. Créer un nouveau dossier à l'endroit que vous souhaitez, puis un nouveau fichier :
services:
toolbox_service:
image: registry.gitlab.com/perso2743752/toolbox:latest
deploy:
replicas: 1
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: any
ports:
- "8082:80"
networks:
- toolbox_network
networks:
toolbox_network:
driver: overlay
Ceci est un exmple vous pouvez créer autant de service, que vous avez d'image. Vous pouvez aussi rajouter des replicas ou autre config à voir dans la documentation de docker.
Ensuite nous allons authentifier notre serveur à notre registry gitlab si ce n'est pas déjà fais, pour pouvoir récupérer nos images.
docker login -u [user_gitlab] -p [password_gitlab] registry.gitlab.com
Nous allons maintenant pré pull les images de notre projet :
docker pull registry.gitlab.com/perso2743752/toolbox:latest # Mettez votre lien d'image
Puis nous allons enfin pouvoir lancer notre applications avec :
docker stack deploy -c compose.yaml [NOM_DU_SERVICE]
Maintenant nous allons récupérer le nom de notre service en faisant :
docker service ls
Et nous allons ajouter notre nom de service dans notre script de déploiment qui sera placé au meme endroit que le compose.yaml
#!/bin/bash
# Nom de la stack
SERVICE_NAME=[NOM_DU_SERVICE]
echo "🔄 Extraction des images depuis $COMPOSE_FILE..."
# Récupérer les images utilisées dans le fichier compose
IMAGES=$(grep "image:" compose.yaml | awk '{print $2}')
# Pull des images
for IMAGE in $IMAGES; do
echo "📥 Pulling image: $IMAGE"
docker pull "$IMAGE"
done
echo "🚀 Déploiement de la stack..."
docker service update --force "$SERVICE_NAME"
# ajouter autant de ligne que de services
echo "✅ Déploiement terminé !"
Puis rendez le script excutable :
chmod +x deploy.sh
Gitlab CI
Dans le fichier crée dans la partie précédente, nous allons rajouter un nouveau stage deploy:
stages:
- build
- deploy
Une nouvelle variable, le chemin sur lequel sera stocké le dossier du deploy.sh:
variables:
PATH_DEPLOY: [CHEMIN_DEPLOY_SH]
puis ajouter cette partie en fin de fichier :
deploy:
stage: deploy
image: alpine:latest
only:
- main
script:
- apk add --no-cache openssh-client
- mkdir -p ~/.ssh
- echo ${SSH_PRIVATE_KEY} | base64 -d > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keygen -l -f ~/.ssh/id_rsa
- ssh -o StrictHostKeyChecking=no ${USER_SERVE}@${IP_SERVE} "cd ${PATH_DEPLOY}/ && ./deploy.sh"