Salutations,
Variispace avançant plutôt bien, je commence à gratter pour le déployer en ligne. Le but étant d'avoir un système permettant de mettre à jour le jeu en ligne, et de gérer les éventuels foirages (quid si la BDD tombe en rade pendant/après le déploiement, quid si MySQL en prod n'arrive pas à digérer les scripts SQL de mon dev, etc)
Initialement, je pensais piocher dans les outils "tout fait", mais je me rend compte qu'ils ne sont qu'une coquille vide: à moi d'aller dire quels fichiers déployer, quoi mettre à jour dans la BDD, etc. Donc, j'ai préféré aller scripter une procédure de déploiement à ma sauce, sans passer par du Jenkins ou du Magallanes.
Mais la question qui me trotte en tête est la suivante: comment gérez-vous la mise à jour du serveur SQL?
Supposons qu'on ait un jeu en ligne, en PHP (ou autre langage osef) avec une BDD SQL (mysql postgre, etc osef). Supposons maintenant qu'on mette le jeu à jour, et qu'on ait des changements de BDD à passer en plus des changements de fichiers PHP (par exemple, on a rajouté le commerce dans le jeu, donc on a des pages PHP en plus, et des modifs SQL comme de nouvelles tables, et des tables modifiées).
Comment l'avez-vous géré?
Pour ma aprt, j'ai procédé ainsi:
- Je lance le script de déploiement du jeu
- Il vérifie que tout est commité (hg st)
- Il prépare les fichiers à mettre en ligne dans un dossier "tmp/release-Y-m-d-H-i-s" (il en copie certains, déplace d'autres, modifie des confs pour intégrer un n° de version, etc)
- Il envoie ça sur le serveur web (mon poste de dev crée une tarball gz de cette release, l'envoie en ligne, et le serveur la dé-tar-gz dans un dossier dédié)
- Le serveur rsync ce dossier de release avec le vrai dossier web du projet, en utilisant un fichier de conf spécial "Mise à jour en cours": ce fichier de conf throw une exception à chaque fois qu'on essaie d'accéder à la BDD, car elle n'est pas à jour (cette exception sera catchée par le reste du code, pour afficher une page "mise à jour en cours" au joueur et retourner le bon code HTTP pour les appels AJAX, qui pourront alors le récupérer et relancer leur requête qq secondes après, pour que ce soit transparent au joueur)
- Le serveur met ensuite la BDD à jour à partir des scripts SQL uploadés (dans la pratique, mes scripts SQL définissent les table/function/procedure/trigger de la BDD, donc le serveur charge tout dans une nouvelle BDD de test, et fait le diff entre cette BDD de test et la BDD du jeu, puis mets la BDD du jeu à jour)
- Si la mise à jour de BDD foire, on stoppe, je suis notifié, et les joueurs resteront sur l'écran "mise à jour en cours" (charge à moi de fixer l'upgrade de BDD pour poursuivre le déploiement)
- Si elle se passe bien, le serveur remplace la config "Mise à jour en cours" par la config normale du jeu, et tout reprend
Donc, j'ai une coupure de service pendant l'upgrade de BDD (mais je ne pense pas qu'elle soit gênante, si les pages web & appels AJAX se relancent tout seuls: ce sera une coupure transparente aux yeux du joueur, qui ne verra à la limite qu'un ralentissement des actions de jeu).
Ca me semble donc pas mal (testé avec un autre projet de backend, qui compile les logs pour en sortir des stats façon Urchin [mais Urchin n'est pas configurable sur un mutu donc j'en ai "réinventé" un bout]), mais j'aimerai savoir comment vous gérez les choses vous?
[edit]
En écrivant ça, je m'aperçoit que si le chargement des SQLs dans la BDD de test est foiré, alors le projet est bloqué pendant un certain temps... Donc, je change un peu:
- Préparation de la targz en local (hg st + copie des fichiers utiles + modifications des fichiers de conf si besoin)
- Upload dans un dossier "releases" du serveur web, et extraction de la tarball dans ce dossier
- Chargement des SQLs dans la BDD de test: en cas de foirage, on s'arrête là et donc le projet en prod n'est pas impacté
- Si succès, release du code sur le serveur web, avec une configuration "mise à jour en cours" qui bloque les accès à la BDD de prod
- Attente de la fin de toutes les actions des joueurs sur la BDD de prod (histoire de ne pas avoir de risque de concurrence)
- Comparaison de la BDD de prod et de la BDD de test précédemment chargée, et application du diff SQL sur la BDD de prod pour la mettre à jour
- Suppression du lock du jeu pour terminer la release complète
Ca me semble pas mal
Variispace avançant plutôt bien, je commence à gratter pour le déployer en ligne. Le but étant d'avoir un système permettant de mettre à jour le jeu en ligne, et de gérer les éventuels foirages (quid si la BDD tombe en rade pendant/après le déploiement, quid si MySQL en prod n'arrive pas à digérer les scripts SQL de mon dev, etc)
Initialement, je pensais piocher dans les outils "tout fait", mais je me rend compte qu'ils ne sont qu'une coquille vide: à moi d'aller dire quels fichiers déployer, quoi mettre à jour dans la BDD, etc. Donc, j'ai préféré aller scripter une procédure de déploiement à ma sauce, sans passer par du Jenkins ou du Magallanes.
Mais la question qui me trotte en tête est la suivante: comment gérez-vous la mise à jour du serveur SQL?
Supposons qu'on ait un jeu en ligne, en PHP (ou autre langage osef) avec une BDD SQL (mysql postgre, etc osef). Supposons maintenant qu'on mette le jeu à jour, et qu'on ait des changements de BDD à passer en plus des changements de fichiers PHP (par exemple, on a rajouté le commerce dans le jeu, donc on a des pages PHP en plus, et des modifs SQL comme de nouvelles tables, et des tables modifiées).
Comment l'avez-vous géré?
Pour ma aprt, j'ai procédé ainsi:
- Je lance le script de déploiement du jeu
- Il vérifie que tout est commité (hg st)
- Il prépare les fichiers à mettre en ligne dans un dossier "tmp/release-Y-m-d-H-i-s" (il en copie certains, déplace d'autres, modifie des confs pour intégrer un n° de version, etc)
- Il envoie ça sur le serveur web (mon poste de dev crée une tarball gz de cette release, l'envoie en ligne, et le serveur la dé-tar-gz dans un dossier dédié)
- Le serveur rsync ce dossier de release avec le vrai dossier web du projet, en utilisant un fichier de conf spécial "Mise à jour en cours": ce fichier de conf throw une exception à chaque fois qu'on essaie d'accéder à la BDD, car elle n'est pas à jour (cette exception sera catchée par le reste du code, pour afficher une page "mise à jour en cours" au joueur et retourner le bon code HTTP pour les appels AJAX, qui pourront alors le récupérer et relancer leur requête qq secondes après, pour que ce soit transparent au joueur)
- Le serveur met ensuite la BDD à jour à partir des scripts SQL uploadés (dans la pratique, mes scripts SQL définissent les table/function/procedure/trigger de la BDD, donc le serveur charge tout dans une nouvelle BDD de test, et fait le diff entre cette BDD de test et la BDD du jeu, puis mets la BDD du jeu à jour)
- Si la mise à jour de BDD foire, on stoppe, je suis notifié, et les joueurs resteront sur l'écran "mise à jour en cours" (charge à moi de fixer l'upgrade de BDD pour poursuivre le déploiement)
- Si elle se passe bien, le serveur remplace la config "Mise à jour en cours" par la config normale du jeu, et tout reprend
Donc, j'ai une coupure de service pendant l'upgrade de BDD (mais je ne pense pas qu'elle soit gênante, si les pages web & appels AJAX se relancent tout seuls: ce sera une coupure transparente aux yeux du joueur, qui ne verra à la limite qu'un ralentissement des actions de jeu).
Ca me semble donc pas mal (testé avec un autre projet de backend, qui compile les logs pour en sortir des stats façon Urchin [mais Urchin n'est pas configurable sur un mutu donc j'en ai "réinventé" un bout]), mais j'aimerai savoir comment vous gérez les choses vous?
[edit]
En écrivant ça, je m'aperçoit que si le chargement des SQLs dans la BDD de test est foiré, alors le projet est bloqué pendant un certain temps... Donc, je change un peu:
- Préparation de la targz en local (hg st + copie des fichiers utiles + modifications des fichiers de conf si besoin)
- Upload dans un dossier "releases" du serveur web, et extraction de la tarball dans ce dossier
- Chargement des SQLs dans la BDD de test: en cas de foirage, on s'arrête là et donc le projet en prod n'est pas impacté
- Si succès, release du code sur le serveur web, avec une configuration "mise à jour en cours" qui bloque les accès à la BDD de prod
- Attente de la fin de toutes les actions des joueurs sur la BDD de prod (histoire de ne pas avoir de risque de concurrence)
- Comparaison de la BDD de prod et de la BDD de test précédemment chargée, et application du diff SQL sur la BDD de prod pour la mettre à jour
- Suppression du lock du jeu pour terminer la release complète
Ca me semble pas mal