Skip to content
On this page

Le Continuous Deployment

Le continuous deployment représente le système permanent le déploiement continu d'une app ou d'un serveur, réduisant ainsi le temps de mise en ligne de nouvelles fonctionnalités. Chez tribuo, il consiste généralement à exécuter un script lors d'un push sur une branch main d'un répo Github. Ce script va alors exécuter une série d'instructions sur le serveur pour ajouter le nouveau code automatiquement au bon endroit.

Ajout des clés de déploiement

Créer une clé de déploiement

Pour pouvoir accéder au repository privé de l'organisation Github sur le VPS Cloud, il faut générer et ajouter une nouvelle clé privé pour chaque repository et modifier la config SSH du serveur.

Pour générer la clé il faut donc éxecuter :

ssh-keygen -t ed25519 -C "your_email@example.com"

Ensuite il est demandé d'indiquer le chemin vers la clé :

/home/ubuntu/.ssh/id_github_tribuo_${NOM_RÉPO}

La clé est dont maintenant généré, il faut donc aller modifier le fichier config SSH pour indiquer la clé correspondante au répo :

sudo nano /home/ubuntu/.ssh/config

Et créer un nouveau block en indiquant un nom de host arbitraire :

Host ${NOM_HOST} github.com
Hostname github.com
IdentityFile ~/.ssh/id_github_tribuo_${NOM_RÉPO}

Maintenant, il faut enregistrer la clé publique que l'on a généré dans Github. Pour cela il faut aller dans les Settings du repository, puis dans Deploy Keys et enfin dans Add deploy key.

Pour obtenir la clé publique à copier :

cat /home/ubuntu/.ssh/id_github_tribuo_${NOM_RÉPO}.pub

La clé est donc bien enregistré et configuré, pour faire des commandes git il faut utiliser les commandes SSH et remplacer le host de base github.com par le nom host que vous avez défini plus tôt :

git clone git@${NOM_HOST}:${NOM_REPO_OFFICIEL}.git .

Récupérer la clé SSH

Ensuite, il faut utiliser la clé id_rsa dans le script de déploiement. Pour la récupérer la clé privée à donner au script, il faut copier la clé basique id_rsa :

cat /home/ubuntu/.ssh/id_rsa

On peut maintenant créer un secret de repository dans Settings > Secrets > Actions :

  • Name => SSHKEY
  • Value => La clé privé copié

Il faut également définir les autres Secrets pour le script :

  • HOST => IP du serveur (51.178.36.203)
  • PORT => Port SSH (22)
  • USERNAME => Utilisateur linux (ubuntu)

CD sur Github

Pour faire du CD sur github, on va utiliser Github Actions. Il suffit de créer un fichier YAML dans le dossier workflows se trouvant lui-même dans le dossier .github :

.
├─ .github
│  ├─ workflows
│  └─── deploy.yml
└─ package.json

Il faut ensuite écrire dans le fichier YAML un script Github Actions qui va exécuter les commande à distance sur le VPS lors d'évènements définis.

Pour une app NodeJS

l'API tribuo.cloud est une app NodeJS et ainsi ne nécessite pas de build, mais il faut arrêter l'app et la redémarrer une foi les fichiers à jour

ATTENTION

Il ne faut pas oublier de mettre à jour les fichiers non versionné manuellement s'ils ont été modifié, comme le fichier .env par exemple.

Voici le script pour le CD d'une app NodeJS :


























 
 
 
 
 
 

# Nom du script
name: Deploy

# On indique que l'on veut exécuter le script à chaque push sur la branche main
on:
  push:
    branches: [main]

jobs:
  deploy-vps:

    # OS du docker qui va exécuter le script, pas important dans notre cas
    runs-on: ubuntu-latest

    steps:
      - name: Executing remote command
        uses: appleboy/ssh-action@master
        with:
          # On indique les secrets à utiliser
          host: ${{ secrets.HOST }}
          USERNAME: ${{ secrets.USERNAME }}
          PORT: ${{ secrets.PORT }}
          KEY: ${{ secrets.SSHKEY }}
          #Les commandes à utiliser à distance
          script: |
            pm2 stop api
            cd /var/www/api.tribuo.cloud/
            git reset --hard HEAD
            git pull
            npm install --production
            pm2 restart api --update-env --log-date-format 'DD-MM HH:mm'

Dans l'exécution des commandes à distance, on fait dans l'ordre :

  • pm2 stop api => On arrête l'application node qui tourne avec PM2
  • cd /var/www/api.tribuo.cloud/ => On se rend dans le dossier contenant les fichiers
  • git reset --hard HEAD => On efface les potentiels changement fait localement sur les fichiers pour éviter les conflits
  • git pull => On récupère le nouveau code sur la branche main
  • npm install --production => On installe les potentiels nouvelles dépendances en mode production
  • pm2 restart api --update-env --log-date-format 'DD-MM HH:mm' => On relance l'application avec PM2 et les bons paramètres

Pour une site avec VueJS

le site docs.tribuo.cloud est un site VueJS et ainsi nécessite un build, mais pas besoin d'arrêter et de relancer un serveur.

ATTENTION

Il ne faut pas oublier de mettre à jour les fichiers non versionné manuellement s'ils ont été modifié, comme le fichier .env par exemple.

Voici le script pour le CD d'un site VueJS :


























 
 
 
 
 

# Nom du script
name: Deploy

# On indique que l'on veut exécuter le script à chaque push sur la branche main
on:
  push:
    branches: [main]

jobs:
  deploy-vps:

    # OS du docker qui va exécuter le script, pas important dans notre cas
    runs-on: ubuntu-latest

    steps:
      - name: Executing remote command
        uses: appleboy/ssh-action@master
        with:
          # On indique les secrets à utiliser
          host: ${{ secrets.HOST }}
          USERNAME: ${{ secrets.USERNAME }}
          PORT: ${{ secrets.PORT }}
          KEY: ${{ secrets.SSHKEY }}
          #Les commandes à utiliser à distance
          script: |
            cd /var/www/docs.tribuo.cloud/
            git reset --hard HEAD
            git pull
            npm install --production
            npm run build

Dans l'exécution des commandes à distance, on fait dans l'ordre :

  • cd /var/www/docs.tribuo.cloud/ => On se rend dans le dossier contenant les fichiers
  • git reset --hard HEAD => On efface les potentiels changement fait localement sur les fichiers pour éviter les conflits
  • git pull => On récupère le nouveau code sur la branche main
  • npm install --production => On installe les potentiels nouvelles dépendances en mode production
  • npm run build => On build l'application

INFO

Dans ce cas-là, notre revers proxy pointe directement sur le dossier dist où est build par défaut le site. On pourrait modifier la config de vite pour build dans un dossier spécial et pointer le revers proxy sur ce dossier si on préfère.

Docs tribuo.cloud