Appearance
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 PM2cd /var/www/api.tribuo.cloud/=> On se rend dans le dossier contenant les fichiersgit reset --hard HEAD=> On efface les potentiels changement fait localement sur les fichiers pour éviter les conflitsgit pull=> On récupère le nouveau code sur la branche mainnpm install --production=> On installe les potentiels nouvelles dépendances en mode productionpm2 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 fichiersgit reset --hard HEAD=> On efface les potentiels changement fait localement sur les fichiers pour éviter les conflitsgit pull=> On récupère le nouveau code sur la branche mainnpm install --production=> On installe les potentiels nouvelles dépendances en mode productionnpm 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.