améliorer notre stratégie de déploiement

12

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?

robjmills
la source

Réponses:

6

Mon conseil pour faire des versions est d'avoir des versions de fonctionnalités et des versions de maintenance. Les versions de fonctionnalités seraient les versions qui obtiennent de nouvelles fonctionnalités. Ceux-ci sont ajoutés à votre coffre subversion. Lorsque vous pensez que ces fonctionnalités sont complètes, vous les branchez dans une branche de publication. Une fois que votre processus d'assurance qualité est satisfait de cette version, vous marquez la version et déployez le code sur vos serveurs.

Maintenant, lorsque vous obtenez un rapport de bogue, vous validez ce correctif dans la branche et le portez dans le tronc. Lorsque vous êtes satisfait du nombre de bogues corrigés, vous pouvez baliser et déployer une version de maintenance.

Il est important que vous ayez une branche de votre base de code en direct (ou que vous puissiez en créer une en connaissant la révision en direct) qui est distincte de votre branche de développement, afin de pouvoir déployer des correctifs sur votre code en direct sans avoir à déployer de nouvelles fonctionnalités ou du code non testé.

Je recommanderais d'utiliser le système de packaging natif de votre distribution pour déployer du nouveau code. Si vous avez un package qui contient toute votre base de code, vous savez que tout votre code a été déployé dans une sorte d'opération atomique, vous pouvez voir quelle version est installée en un coup d'œil, pouvez vérifier votre base de code en utilisant la somme de contrôle de vos packages. La restauration n'est qu'un cas d'installation de la version précédemment installée du package.

Le seul obstacle que je peux voir pour vous implémenter est que vous semblez avoir plusieurs copies de la base de code pour différents clients fonctionnant sur un seul serveur. J'essaierais d'arranger votre code pour que tous les clients utilisent les mêmes fichiers et n'utilisent pas de copies. Je ne sais pas à quel point cela serait facile pour vous, mais réduire le nombre d'exemplaires auxquels vous devez faire face réduira considérablement vos maux de tête.

Je suppose que comme vous l'avez mentionné LAMP, vous utilisez PHP ou un autre langage de script, qui ne nécessite pas de processus de compilation. Cela signifie que vous manquez probablement un merveilleux processus appelé intégration continue. Cela signifie essentiellement que votre code est continuellement testé pour vous assurer qu'il est toujours dans un état libérable. Chaque fois que quelqu'un enregistre un nouveau code, un processus le prend et exécute le processus de génération et de test. Avec un langage compilé, vous l'utiliseriez généralement pour vous assurer que le code est toujours compilé. Avec chaque langue, vous devriez profiter de l'occasion pour exécuter des tests unitaires (votre code est en unités testables n'est-ce pas?) Et des tests d'intégration. Pour les sites Web, un bon outil pour tester les tests d'intégration est Selenium. Dans nos versions Java, nous mesurons également la couverture de code et les mesures de code pour voir comment nous progressons dans le temps. Hudson est le meilleur serveur CI que nous ayons trouvé pour Java, mais quelque chose comme buildbot pourrait mieux fonctionner pour d'autres langues. Vous pouvez créer des packages à l'aide de votre serveur CI.

David Pashley
la source
Merci. oui, nous utilisons PHP. Je dois admettre que je ne suis pas trop sur l'intégration continue, d'après ce que je sais, c'est très similaire aux tests unitaires, mais je n'en sais pas beaucoup plus. Nous aimons les tests unitaires mais notre base de code a encore beaucoup de code procédural hérité qui ne se prête pas vraiment aux tests unitaires. cependant, il serait bon d'entendre vos idées sur la façon dont notre code pourrait être mieux organisé pour empêcher la réplication.
robjmills
l'intégration continue consiste littéralement à exécuter des tests automatisés à chaque enregistrement, à chaque heure ou à chaque jour. Tant que vous le faites régulièrement et automatiquement, c'est à peu près CI.
David Pashley
j'ai vu cet article aujourd'hui sur l'utilisation de hudson avec PHP et Phing - toptopic.wordpress.com/2009/02/26/php-and-hudson
robjmills
1

Nous avons commencé à utiliser Puppet (produit phare de Reductive Labs). Il s'agit d'un cadre basé sur Ruby pour automatiser les tâches d'administration système. J'étais au camp de marionnettes il y a quelques semaines et voici les liens vidéo:

Présentation de Luke Kanies - Puppet Intro

Aussi, si vous souhaitez voir toutes les présentations faites au puppetcamp à san francisco, voici le lien:

Présentations sur la façon dont les autres ont utilisé la marionnette

Prendre plaisir.

Nikolas Sakic
la source