Déployez votre code sur votre serveur depuis Gitlab en SSH

Publié le 23 septembre 2020

Je suis un grand faignant, et je déteste faire les choses manuellement. Notamment les déploiements sur un serveur. En effet, je pense que cela devrait être aussi simple que de pousser son code sur Git. C’est pour cela que j’ai décidé d’automatiser la plupart de mes déploiements.

L’objectif est d’atteindre le processus suivant :

  1. Une fois mon développement terminé, je commit mon code sur la branche « master » de mon projet.
  2. Quand les modifications sont poussées sur mon repository Gitlab, le serveur de pré-production met à jour son code
  3. J’effectue une recette afin de vérifier que tout fonctionne. Je peux également lancer des tests automatisés
  4. Une fois validé, je clique sur un bouton pour pousser le code en production
  5. Le code se met à jour automatiquement en production

Configurer Gitlab pour déployer sur le serveur

Attention

Pour automatiser le déploiement, nous avons besoin d’un accès SSH. Il est recommandé de créer un utilisateur spécifique à l’application, ayant le moins de droits possibles afin d’éviter (en cas de leak de la clé privée) que tout le serveur soit compris.

Pour pouvoir mettre en place ce process, on va utiliser la section « CI/CD » de Gitlab. Voici le contenu du fichier « .gitlab-ci.yml »

stages:
  - deploy_staging
  - deploy_prod

before_script:
  - apt-get update -qq
  - apt-get install -qq git
  - 'which ssh-agent || ( apt-get install -qq openssh-client )'
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    
deploy_staging:
  type: deploy
  stage: deploy_staging
  environment:
    name: staging
    url: https://preprod.loickvirot.fr
  script:
    - ssh $SSH_AUTH -p $SSH_PORT "cd $STAGING_DEPLOY_PATH && git checkout master && git pull origin master && exit"
  only:
    - master
    
deploy_prod:
  type: deploy
  stage: deploy_prod
  environment:
    name: prod
    url: https://loickvirot.fr
  script:
    - ssh $SSH_AUTH -p $SSH_PORT "cd $PROD_DEPLOY_PATH && git checkout master && git pull origin master && exit"
  only:
    - master
  when: manual

Voici les variables secrètes enregistrées dans Gitlab :

  • SSH_PRIVATE_KEY: La clé privée permettant d’accéder au serveur
  • SSH_AUTH: la combinaison utilisateur / IP du serveur (exemple : [email protected])
  • SSH_PORT: le port de connexion au SSH. Si vous n’avez pas changé le port par défaut (22), il n’est pas nécessaire d’ajouter l’option « -p ».
  • STAGING_DEPLOY_PATH et PROD_DEPLOY_PATH : le chemin absolu du projet sur le serveur.

Pour enregistrer des variables secrètes sur Gitlab, allez dans la section « Settings » puis « CI/CD », puis ouvrez la partie « Variables »

Pour le déploiement, j’utilise l’image définie par défaut par Gitlab, car je n’ai pas besoin d’avoir un environnement précis pour déployer. En effet, je n’effectue pas encore de tests.

Je défini deux étapes : le déploiement en pré-production puis en production. Cela me permet d’être sur d’avoir déployé en pré-production avant le déploiement en production.

Avant de commencer les déploiements, je configure l’environnement Gitlab pour se connecter en SSH à mon serveur : j’installe d’abord OpenSSH et Git, pour respectivement me connecter au serveur, puis récupérer le code sur Gitlab. Ensuite, je récupère la clé privée qui me permet d’accéder à mon environnement.

Quand Gitlab détecte une mise à jour du code sur la branche master, le runner va se connecter en SSH au serveur, aller dans le dossier ou se situe le projet de pré-production, et récupérer le contenu de master sur la machine. Il se passe la même chose pour la production, excepté que l’exécution du déploiement est déclenché manuellement depuis Gitlab.

 

Et voila! On a maintenant les deux jobs du pipeline qui sont exécutés ! On a bien le premier job « deploy staging », qui met la pré-production à jour. Puis, avec le bouton depuis Gitlab, je peux a tout moment déployer en production