Build TFS serveur build de la branche?
nous avons un projet TFS 2008 avec deux branches ("Main "et"NewFeature"). Chacune est une "copie" (variante) complète et indépendante du code source.
en changeant les mappages de l'espace de travail, nous pouvons mapper l'une ou l'autre variante sur nos PC locaux et avons travaillé avec les deux branches sans aucun problème.
cependant, si je mets en place les mappings pour activer notre serveur de compilation sur la branche NewFeature (qui devrait simplement swap dans le code source de NewFeature sans rien changer) d'autre autant que le serveur de build), j'obtiens une erreur:
There is no working folder mapping for $/Main/Product.sln
c'est-à-dire que lorsqu'il est construit à partir de la branche de la nouvelle construction, quelque chose est encore en train de chercher dans le Main branche, même s'il n'y a aucune référence à cette branche dans le code source. Il semble cacher une référence à Main?!
j'ai fait une compilation complètement propre (j'ai supprimé le dossier de compilation du serveur et lancé la compilation avec / p:ForceGet=true pour être sûr que la correspondance est il n'y a aucun fichier sur le serveur qui pourrait mettre en cache les fixations de l'espace de travail), mais cela n'aide pas.
des suggestions?
6 réponses
Vérifier que:
- $(SolutionToBuild) utilise un chemin relatif lors du référencement du produit.la sln
- le chemin relatif entre $/Newmeature/.../ TFSBuild.proj et $ / Newceature / Product.la sln est le même que dans la branche Principale.
/ EDIT/
Notez, cependant, c'est il est important que $/Main et $/Branches / Feature vivent au même niveau dans la hiérarchie de l'arbre. Le chemin local sur le serveur de compilation ne devrait pas non plus avoir d'importance.* Tout ce qui compte, c'est ce qu'il y a sous chaque branche. Si le table des matières est cohérent en interne alors tous vos scripts de construction existants devraient fonctionner sans modification.
pour des exemples concrets de la façon dont j'aime lier tout, voir mes réponses passées, par exemple:
- Teambuilds Modulaires
- gestion SDLC pour les Scripts de construction TFS
- Où mettre mon projet de base de données dans TFS?
- comment partagez-vous les dépendances externes entre les solutions Visual Studio?
Mon chemin n'est pas le seul moyen, mais je peux attester qu'il fonctionne mieux que tous les autres variations que j'ai rencontrés au fil des ans :)
* franchement, essayer de microgérer la Constitution d'une équipe peut devenir beaucoup plus douloureux que la restructuration proposée de vos scripts MSBuild. Pour la fiabilité, vous devez placer votre tfsbuildservice.EXE.config personnalisations sous contrôle de version quelque part...si vous possédez > 1 build server (ou pourrait dans le futur), alors vous devez envisager une stratégie de déploiement du changement...vous finissez par avoir besoin d'un processus meta-SCM pour gérer votre processus SCM!
j'ai aussi eu ce problème lors de l'exécution d'un build à partir d'une branche dans TFS 2010. TFS a déclaré qu '" il n'y a pas de mise en correspondance des dossiers pour $/Main/Product.la sln" La solution est avéré être à modifier la définition de build comme suit (je suis en utilisant le "Modèle par Défaut" modèle de processus de génération-je n'ai pas essayé cela avec un modèle personnalisé):
- allez à la section Processus/onglet de la définition de construction.
- Développez 1. Requis et cherchez projets à construire. Assurez-vous que cette entrée pointe vers le fichier solution à l'intérieur de la branche que vous construisez.
- Développez 2. De base et cherchez Tests Automatisés. Pointez ceci vers le bon fichier de paramètres de test dans la branche en cours de construction.
OK, les résultats sont dans-j'ai trouvé une solution.
en raison de nos processus de construction hérités (construire, copier, brouiller, construire des installateurs personnalisés, copier vers le dossier laisser tomber), Je ne peux pas facilement placer la branche le long de la branche principale. Il doit remplacer.
donc, si J'ai Main et NewFeature, je souhaite démonter Main et cartographier NewFeature à sa place (i.e. utiliser "c:\Main" sur le serveur de compilation, et il suffit de changer le code source qui apparaît y)
Solution #1 (la solution la plus simple, évidente et logique) est d'utiliser ces mappages:
- $ / Newmeature -> c:\Main
résultat attendu: la nouvelle structure de code remplace simplement Main, et le serveur de compilation ne sait pas que C'est sur une branche différente.
Résultat: Échec avec un "vous n'avez pas mappé $/Main, même si vous ne l'utilisez pas d'erreur".
Solution #2 est à faire ceci:
- $/Principal -> c:\IgnoreThisFolder
- $ / Newmeature -> c:\Main
cela fonctionne (il supprime l'avertissement et permet ainsi à la construction de continuer avec MSBuild ignorant qu'elle est en construction dans une branche). Cependant, c'est laid et la compilation obtient tout le code source de la branche principale inutilement.
Solution #3 (non testé, trop cher à essayer sauf si je sais que ça marchera mieux que le #2) est:
- déplacer tout le code source (de $/Main, $/Branches/Feature) à $/Branches/Main et $/Branches / Feature pour obtenir une profondeur cohérente de la hiérarchie, et réécrire le script MSBuild pour travailler avec ces nouveaux chemins.
J'espère que je pourrai alors mapper uniquement la branche dont j'ai besoin et éditer TFSBuild.proj de le rediriger de construire dans cette branche.
(Edit: Oui, cela fonctionne bien. Nous avons maintenant réorganisé toute notre structure de code de sorte que tout branches) est sous une racine commune dans un projet D'équipe unique, et brancher/construire n'est plus un problème - il est facile de faire tout ce dont nous avons besoin maintenant. Le truc est d'insérer un dossier racine dans la hiérarchie pour que vous puissiez vous brancher à n'importe quel niveau. J'ai ajouté un petit ajustement au script de construction pour que nous puissions passer la branche à construire comme paramètre à MSBuild, donc il est facile de construire n'importe quelle variante maintenant. Toutes les branches sur lesquelles nous ne voulons pas travailler peuvent simplement être masquées et le serveur de compilation reste heureux.)
Sommaire Toutes ces solutions (pour utiliser le terme technique) sucer. Vous devez remaper l'espace de travail (dans ce cas, ce n'est pas simple: 9 entrées de mapping sont nécessaires donc c'est une chose sujette aux erreurs et fastidieuse à faire), éditer le TFSBuild.proj, supprimez tout le code source, et exécutez une compilation avec /p: ForceGet=true pour commuter la compilation entre les branches. Il faut donc environ une heure pour changer de branche. Incroyable - cela devrait prendre quelques minutes à la plupart des!
je me rends compte que notre projet est loin d'être idéalement mis en place, mais je ne peux pas croire qu'il devrait être aussi difficile à brancher dans TFS (C'était un morceau de gâteau dans SourceSafe, Accurev, et Perforce, alors pourquoi si douloureux dans TFS?).
comment tout le monde organise-t-il ses branches TFS? Comment passez-vous les développeurs entre les branches? Comment permuter les constructions de serveur entre les branches? Est-il vraiment à ce douloureux?
lorsque vous éditez la définition de build il y a deux endroits qui doivent être changés.
- paramètres Source-pointez vers votre nouveau site de projet
- processus - (cela prend parfois un certain temps à charger, alors soyez patient) sous "requis", changez l'emplacement des "éléments à construire" pour la nouvelle solution.
J'espère que cela vous aidera.
Nouvelle mise à jour:
comme indiqué dans l'autre réponse, j'ai trouvé une solution de contournement qui était acceptable pour une branche de fonctionnalité de courte durée, mais qui ne fonctionnait pas vraiment très bien. Je suis depuis revenu au problème, et la solution complète est ridiculement simple:
dans le bâtiment TFSBuild.proj, le chemin était basé sur $(BuildProjectFolderPath). Ce chemin correspond à un côté serveur (chemin de contrôle source) comme $ / Main - pas un chemin local (D:\ServerBuildFolder\Main).
malheureusement, pour des raisons historiques, notre code source est divisé en plusieurs projets d'équipe, ce qui signifie que la seule "branche" est fragmentée en plusieurs dossiers ramifiés dans le contrôle Source (c.-à-d. $/Main/Code et $/Libraries/Code. Vous ne pouvez pas créer une branche qui contient $/Main et $/Libraries). Nous devons donc réassembler ces fragments disparates du contrôle Source dans une hiérarchie cohérente en utilisant des mappages de l'espace de travail.
Cela signifie que Richard était sur le chemin relatif du bâtiment fédéral.proj dossier à la .la sln fichier est incorrect, parce que MSBuild/TFS est en supposant que l' .sln fait partie de la même équipe de projet et de la même hiérarchie de contrôle des sources (donc recherche $/Main/Libraries).sln au lieu de $/Libraries/Libraries.sln).
la solution est simple: j'ai remplacé $(BuildProjectFolderPath) par un chemin local (e.g. D:\ServerBuildFolder\Main) pour les fichiers, de sorte que la référence relative a été résolue dans "local space" (après l'application des mappages), et MSBuild tourne maintenant avec douceur.
La morale de l'histoire: 1) N'utilisez jamais plus d'un projet D'équipe s'il y a une chance que vous souhaitiez jamais avoir une quelconque référence entre ces bases de code. Ne soyez pas dupe en pensant qu'un nouveau projet D'Équipe offrira une sorte de distinction logique et sans douleur entre les applications et les bibliothèques. Projets supplémentaires se sont avérés être juste un cauchemar d'administration-charges de problèmes supplémentaires pour absolument aucun avantage. (Il s'agit d'une grande pile partagée sous le capot, donc tous les éléments de travail et les dossiers de contrôle des sources sont encore visibles dans tous les projets (!), mais il ajoute quelques murs de briques qui rendent les liens entre les projets très problématiques)
2) Créez toujours un seul dossier racine dans le contrôle source de votre projet D'équipe, puis mettez tout le reste sous ce dossier. par exemple pour le projet "$ / Main", créer "$ / Main / Root" et ensuite tout mettre dans la hiérarchie des sources à l'intérieur de la Racine.
en suivant ces règles, vous serez en mesure de brancher le dossier "Root" unique à l'avenir, et vous n'aurez alors besoin que d'une seule branche et d'une seule cartographie supplémentaire de l'espace de travail. Cela vous aidera à éviter la calvitie prématurée.
(pour ma défense, je l'aurais fait de cette façon pour commencer - je travaille avec un héritage de l'installation. En défense de la configuration d'héritage, il semble bon sur le papier, mais n'est tout simplement pas une approche soutenue par Microsoft!)
j'ai eu cette erreur et tout ce que je peux comprendre c'est que la définition est devenue corrompue ou quelque chose comme ça. Je viens de rediriger les processus (j'ai ajouté la solution que j'essayais de construire) et j'ai modifié les espaces de travail et ça a recommencé à fonctionner. HTH.