OK, je poursuis donc la discussion.
Originellement adepte du "presque-tout-automatisé" jusqu'au déploiement en prod qui se faisait manuellement :
| ssh monServeur
./stopMaPileApplicative.sh
./scriptDeDeploiement.sh
./startMaPileApplicative.sh
|
(grosso modo)
Je suis passé un peu plus récemment à une mécanique complètement automatisée.
En gros :
- y'a plein de repos Git, N pour le back, M pour le front.
- chacun a un processus de build à sa sauce (gradle / grunt principalement)
- on attend un résultat sous forme "deployable" (une archive quoi, un jar, un war, …) contenant à la fois les ressources front et back
- à côté de ça y'a des BDD, et d'autres trucs éventuellement à déployer
Du coup : l'outil d'intégration continue joue le rôle de chef d'orchestre, il fait ses git pull, appelle les scripts de déploiement (potentiellement avec des variables d'environnement, une config particulière suivant le contexte : prod / préprod) et en sortie, il a une archive déployable. Jusque là rien de nouveau sous le soleil.
Par contre, là où ça devient pénible c'est la migration de données, etc. et passer à la main d'éventuels scripts en serrant les fesses.
Le truc qui a résolu ce soucis dans mon cas c'est Docker. Le résultat du build n'est plus un ensemble de "trucs" (archives compressées + scripts) mais une image complète du système, prête à déployer. Du coup, c'est à l'outil d'intégration continue de construire l'ensemble de l'image Docker, qui elle contiendra les scripts de migration pour la BDD etc. Et eventuellement des ajustements niveau système etc.
Du coup que je déploie en pré-production ou en production, il n'y a pas de différence sensible, dans les deux cas j'ai une image docker que je vais déployer sur une machine. Soit sur une machine AWs, soit sur ma machine locale, soit sur une machine dédiée etc. Même OS, même config (sauf ce que j'ai décidé qui était différent), …
Au niveau du processus de MeP c'est trivial et n'importe qui avec les droits suffisants peut le faire sans trembler : il suffit de cliquer sur un bouton.
Si ça se passe mal, on rollback sur l'ancienne image "tant pis, on verra demain".
Ca permet vraiment d'avoir un processus d'intégration continue très "iso" et limiter les mauvaises surprises.