2010-07-15 12 views
4

Nous nous sommes tous énervés de svn à hg et comme le workflow de développement est plus ou moins vidé, il reste le système le plus difficile: le staging et l'intégration.Passage de Subversion à Mercurial - comment adapter le workflow et les systèmes de staging/intégration?

Espérons que cette question va un peu plus loin que votre commune «comment puis-je passer de xxx à Mercurial». S'il vous plaît pardonner longue question et probablement mal écrite :)

Nous sommes un magasin Web qui fait beaucoup de projets (principalement PHP et Zend), nous avons donc un énorme svn repo, avec comme plus de 100 dossiers, chacun représentant un projet avec c'est propre tags, branches et tronc bien sûr. Sur notre serveur d'intégration et de test (où QA et clients regardent les résultats de travail et les tests), tout est très automatisé - Apache est configuré pour prendre automatiquement de nouveaux projets en créant vhost pour chaque projet/tronc; scripts de migration mysql là aussi dans le coffre et les développeurs peuvent les appliquer via une interface web simple. Longue histoire courte de notre flux de travail est maintenant:

  1. Code Checkout, travailler, commettras
  2. Run mise à jour sur le serveur via l'interface Web (cela ne essentiellement svn sur serveur sur un projet particulier et exécuter également DB- script de migration si nécessaire)
  3. change d'assurance qualité sur le serveur

Cette approche est certainement suboptimale pour les grands projets quand nous avons 2+ développeurs travaillant sur le même code. Se ramifier en svn ne faisait que causer plus de maux de tête, et donc passer à Mercurial. Et voici où la question se pose - comment organiser un serveur de staging/intégration/test efficace pour ce type de travail (où vous avez beaucoup de projets, disons que seul développeur pourrait travailler sur 3 projets différents en 1 jour).

Nous avons décidé d'avoir essentiellement la production de suivi de branche par défaut, puis d'effectuer tous les changements dans les branches individuelles. Dans ce cas, comment pouvons-nous automatiser les mises à jour de mise à jour pour chaque branche? Si plus tôt pour un projet nous travaillions presque toujours sur le tronc, nous avions besoin d'une DB, d'un vhost, etc. Maintenant, nous parlons potentiellement des N-bases de données par projet, des configs N-vhost, etc. exécuter phpDocumentor et/ou tests unitaires)? Devrait-il être fait sur le «défaut»? Sur les branches?

Je me demande comment les autres équipes ont résolu ce problème, peut-être quelques bonnes pratiques que nous n'utilisons pas ou que nous ignorons?

Notes complémentaires:

probablement utile de mentionner que nous avons choisi Kiln en tant que service d'hébergement de prise en pension (la plupart du temps, puisque nous utilisons FogBugz de toute façon)

Répondre

3

C'est absolument pas la réponse complète, vous finirez par choisir, mais voici quelques outils qui facteur susceptible en elle:

  • référentiels sans répertoires de travail - si vous clone -U ou hg update null vous obtenez un référentiel sans répertoire de travail (seulement le .hg). Ils sont mieux sur le serveur, car ils prennent moins de place et pas on est tenté de modifier il
  • changegroup crochets

Pour ce dernier le changegroup crochet fonctionne chaque fois un ou plusieurs changesets arrivent par pousser ou tirer et vous pouvez le faire des choses intéressantes telles que:

  • pousser les changesets à une autre prise en pension en fonction de ce qui est arrivé
  • mise à jour le répertoire de travail de prise en pension de réception

Par exemple, on pourrait automatiser quelque chose comme cela en utilisant uniquement les outils décrits ci-dessus:

    développeur
  1. pousse cinq changesets au centre-repo/projet1/main
  2. dernier changeset est sur la branche « my-expérience «si csets sont automatually re-poussé pour éventuellement créé repo central repo/projet1/my-expérience
  3. -repo central/projet1/ma-expérience fait automatiquement hg update tip qui est certain d'être sur la branche my-expiriment
  4. central repo/projet1/my-expérience exécute automatiquement des tests dans le répertoire de travail et si elles passent ne un « make dist » qui se déploie, ce qui pourrait mettre en place la base de données et vhost trop

Le trop grave, et le chapitre 10 dans le livre mercurial couvre cela, est de ne pas attendre l'utilisateur sur ce processus. Vous voulez que l'utilisateur pousse à un repo qui contient probablement-bon-code et le traitement automatisé faire l'IC et déployer le travail, qui si elle passe finit par être un repo probable-okay. Dans la plus grande configuration mercuriale dans laquelle j'ai travaillé (une vingtaine de développeurs), nous sommes arrivés au point où notre système CI (Hudson) tirait des repos-peut-être pour chaque périodiquement puis construction et test, et gérer chaque branche séparément.

Bottom line: tous les outils dont vous avez besoin pour configurer ce que vous souhaitez probablement déjà exister, mais les coller ensemble sera un travail ponctuel.

+1

Réponse beaucoup plus détaillée que la mienne. +1 J'aime la poussée active traitée automatiquement sur le serveur distant. – VonC

+0

Merci VonC et Ry4an - vos deux réponses sont vraiment très utiles. Je me suis dit que je pensais dans la bonne direction (heureusement :) –

2

Ce que vous devez retenir est que DVCS (vs. CVCS) introduit une autre dimension à versioning:
Vous ne devez pas compter plus que sur la ramification (et obtenir un espace de travail de mise en scène de la branche droite)
Vous pouvez maintenant avoir avec le DVCS publication workflow (push/pull entre repo)

Signification votre environnement de mise en scène est maintenant une prise en pension (avec l'historique complet du projet), vérifié à une succursale:
De nombreux développeurs peuvent pousser de nombreuses branches différentes à ce staging repo: le processus de réconciliation peut être fait isolément dans ce repo, dans une branche "principale" de votre choix.
Ou ils peuvent tirer cette branche de mise en scène dans leur repo et tester les choses avant de repousser.

alt text http://hginit.com/i/02-repo.png
De tutoriel de Joel sur Mercurial HgInit

Un développeur ne pas nécessaires doivent engager pour d'autres à voir: le publication process in a DVCS permet lui/elle de tirer la branche de la mise en scène d'abord, concilier n'importe quel conflit localement, et puis pousser au repo de mise en scène.

+0

Merci VonC et Ry4an - vos deux réponses sont vraiment très utiles.J'ai pensé dans la bonne direction (j'espère :) –