Toutes les étapes que nous avons réalisés pour faire du continuous delivery
Docker 🐳
Docker est une solution de conteneurisation LXC permettant de créer des conteneurs. ces conteneurs contiennent l'application ainsi que toutes les librairies systèmes. les avantages de docker sont :
Compatibilité : les conteneurs sont cloisonnés et contiennent leur propre configuration, une fois docker installée l'application l'application fonctionnera sans problème.
Immutabilité : l'image reste intacte et se réinitialise à chaque démarrage.
Scalabilité : On peut lancer de multiplesinstances de notre application sur de multiples serveurs sans problème de compatibilité.
Rapidité : Les conteneurs se lancent en moins d'une seconde car ils partagent tous le même noyau du PC hôte une image Linux Alpine fait 5 MO.
Docker-compose 🏆
# docker-compose.yml script de lancement de notre applicationversion:'3'services:webapp:build:. # construit notre application à partir du Dockerfileimage:react-app # nom de notre image aprés constructionports:# Mapping du port 80 local vers le port 80 du conteneur-"80:80"
Nginx configuration ⛳️
Dans cette partie il s'agit d'un simple fichier de configuration nginx qu'on va ajouter dans notre image permettant de servir notre application au port 80.
Docker file 🚤
Un Dockerfile est un fichier indiquant toutes les étapes permettant la construction d'une image de notre application, une fois cette image créée on peut lancer une instance de cette image nommée conteneur.
Jenkins est une solution Open source écrite en java permettant l'intégration et le déploiement continue.
Les possibilités de Jenkins sont infini, cela va du simple test d'intégration au déploiement sur une grande infrastructure grâce à sa richesse de plugin.
Pour notre projet nous avons coder une simple pipeline pour que Jenkins récupère notre projet à jour, le construire et le déployer automatiquement sur notre serveur.
Pipeline configuration 🎯
On définit 3 étapes :
Pull : Une de mise a jour qui consiste a récupérer la dernière version de notre application sur Github à la branche Master.
Build : La construction de notre application à partir du docker-compose et Dockerfile
Deploy : Déploiement l'application -> On éteint et on supprime notre ancienne version d'application sur docker puis on redémarre avec la nouvelle version récemment construite.
# On recupère une image de NodeJS vierge à partir du Dockerhub
FROM node:alpine as build
# On specifie le dossier du conteneur sur lequel on compte travailler (mkdir + cd)
WORKDIR /app
# On copie le fichier de dépendance npm de notre ordinateur vers le conteneur
COPY package*.json /app/
# On installe les dépendances
RUN npm install ---loglevel verbose && \
npm install react-scripts@3.4.1 -g --loglevel verbose
# On copie les fichiers sources vers le conteneurs
COPY . .
# On ajoute Le dossier .bin dans le PATH afin de permettre à react-script de build
# l'application
ENV PATH /app/node_modules/.bin:$PATH
RUN npm run build ---loglevel verbose
# NGINX
# On récupère une image vierge de nginx basé sur l'OS Alpine
FROM nginx:alpine
# On copie l'application de production vers notre nouveau conteneurs
COPY --from=build /app/build /usr/share/nginx/html
# On remplace le fichier de configuration par defaut par le notre
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d
# On permet l'accées au port 80 de notre conteneur
EXPOSE 80
# A l'execution nginx sera lancé
CMD ["nginx","-g","daemon off;"]
node {
stage('pull'){
git 'https://github.com/LasCC/HomeDelivery.git'
}
stage('build'){
sh '/usr/local/bin/docker-compose build'
}
stage('deploy'){
sh '/usr/local/bin/docker-compose down && docker system prune -f && /usr/local/bin/docker-compose up -d'
}
}