stages: - build - deploy variables: DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA DOCKER_IMAGE_LATEST: $CI_REGISTRY_IMAGE:latest # Build (Identique, je ne le change pas) build: stage: build image: docker:24 services: - docker:24-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY script: - docker build -t $DOCKER_IMAGE -t $DOCKER_IMAGE_LATEST . - docker push $DOCKER_IMAGE - docker push $DOCKER_IMAGE_LATEST only: - main - master # Deploy CORRIGÉ deploy: stage: deploy image: alpine:latest before_script: - apk add --no-cache openssh-client - eval $(ssh-agent -s) # Utilisation de printf pour éviter les soucis de saut de ligne - printf "%s\n" "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - mkdir -p ~/.ssh - chmod 700 ~/.ssh - ssh-keyscan -H $DEPLOY_SERVER >> ~/.ssh/known_hosts script: - | # ATTENTION : EOF sans guillemets ici pour que GitLab injecte les variables ssh $DEPLOY_USER@$DEPLOY_SERVER << EOF set -e # Arrête le script si une commande échoue # Créer le dossier dev s'il n'existe pas mkdir -p ~/dev cd ~/dev echo "Déploiement de l'image : $DOCKER_IMAGE_LATEST" # Login au registry GitLab echo "$CI_REGISTRY_PASSWORD" | docker login $CI_REGISTRY -u $CI_REGISTRY_USER --password-stdin # Pull la nouvelle image docker pull $DOCKER_IMAGE_LATEST # Arrêter et supprimer l'ancien container (avec || true pour ne pas bloquer si inexistant) docker stop portfolio || true docker rm portfolio || true # Lancer le nouveau container docker run -d \ --name portfolio \ --restart unless-stopped \ -p 3006:3000 \ $DOCKER_IMAGE_LATEST # Nettoyage docker image prune -af --filter "until=24h" echo "Déploiement terminé avec succès !" EOF only: - main - master when: on_success