Nous avons une application de commerce électronique que nous développons dans notre entreprise. C'est une application LAMP raisonnablement standard que nous développons depuis environ 3 ans. Nous développons l'application sur un domaine de test, ici nous ajoutons de nouvelles fonctionnalités et corrigeons des bugs, etc. Notre suivi des bugs et le développement des fonctionnalités sont tous gérés au sein d'une solution de subversion hébergée (unfuddle.com). Au fur et à mesure que des bogues sont signalés, nous apportons ces correctifs sur le domaine de test, puis nous validons les modifications de svn lorsque nous sommes satisfaits que le bogue a été corrigé. Nous suivons cette même procédure avec l'ajout de nouvelles fonctionnalités.
Il convient de souligner l'architecture générale de notre système et de nos applications sur nos serveurs. Chaque fois qu'une nouvelle fonctionnalité est développée, nous déployons cette mise à jour sur tous les sites utilisant notre application (toujours un serveur que nous contrôlons). Chaque site utilisant notre système utilise essentiellement les mêmes fichiers pour 95% de la base de code. Nous avons quelques dossiers dans chaque site qui contiennent des fichiers sur mesure pour ce site - fichiers / images css, etc. À part cela, les différences entre chaque site sont définies par divers paramètres de configuration dans la base de données de chaque site.
Cela rejoint le déploiement lui-même. Au fur et à mesure que nous sommes prêts à lancer une mise à jour, nous exécutons une commande sur le serveur sur lequel se trouve le site de test. Ceci exécute une commande de copie (cp -fru / testsite / / othersite /) et passe par chaque force vhost mettant à jour les fichiers en fonction de la date de modification. Chaque serveur supplémentaire que nous hébergeons possède un vhost sur lequel nous resynchronisons la base de code de production et nous répétons ensuite la procédure de copie sur tous les sites de ce serveur. Au cours de ce processus, nous supprimons les fichiers que nous ne voulons pas écraser et les remettons en place une fois la copie terminée. Notre script de déploiement exécute un certain nombre d'autres fonctions telles que l'application de commandes SQL pour modifier chaque base de données, l'ajout de champs / de nouvelles tables, etc.
Nous sommes de plus en plus préoccupés par le fait que notre processus n'est pas suffisamment stable, pas tolérant aux pannes et est également un peu une méthode de force brute. Nous sommes également conscients que nous n'utilisons pas au mieux la subversion car nous avons une position où travailler sur une nouvelle fonctionnalité nous empêcherait de déployer un correctif de bogue important car nous n'utilisons pas de branches ou de balises. Il semble également faux que nous ayons autant de réplication de fichiers sur nos serveurs. Nous ne pouvons pas non plus effectuer facilement une restauration de ce que nous venons de déployer. Nous effectuons un diff avant chaque déploiement afin que nous puissions obtenir une liste des fichiers qui seront modifiés afin que nous sachions ce qui a été modifié après, mais le processus de restauration serait toujours problématique. En termes de base de données, j'ai commencé à étudier dbdeploy en tant que solution potentielle. Ce que nous voulons vraiment, c'est quelques conseils généraux sur la façon dont nous pouvons améliorer notre gestion et notre déploiement de fichiers. Idéalement, nous souhaitons que la gestion des fichiers soit plus étroitement liée à notre référentiel afin qu'un déploiement / restauration soit plus connecté à svn. Quelque chose comme utiliser la commande d'exportation pour vous assurer que les fichiers du site sont les mêmes que les fichiers repo. Il serait également bon que la solution arrête également la réplication de fichiers autour de nos serveurs.
Ignorant nos méthodes actuelles, il serait vraiment bon d'entendre comment d'autres personnes abordent le même problème.
pour résumer ...
- Quelle est la meilleure façon de faire en sorte que les fichiers sur plusieurs serveurs restent synchronisés avec svn?
- Comment empêcher la réplication de fichiers? liens symboliques / autre chose?
- Comment devrions-nous structurer notre référentiel afin de pouvoir développer de nouvelles fonctionnalités et corriger les anciennes?
- Comment déclencher des déploiements / rétrogradations?
Merci d'avance
ÉDITER:
J'ai lu beaucoup de bonnes choses récemment sur l'utilisation de Phing et Capistrano pour ce genre de tâches. Quelqu'un peut-il donner plus d'informations à leur sujet et à quel point il serait bon pour ce genre de tâche?