2008-10-21 9 views
7

J'ai plusieurs branches dans TFS (dev, test, stage) et quand je fusionne les changements dans la branche de test, je veux que le script de build et de déploiement automatisé trouve tous les fichiers SQL mis à jour et déploie à la base de données de test.Programmer trouver les modifications TFS depuis la dernière bonne construction

Je pensais pouvoir le faire en trouvant tous les changesets associés à la construction depuis la dernière bonne construction, en trouvant tous les fichiers sql dans les changesets et en les déployant. Cependant, je ne semble pas avoir le changeset associé à la construction pour une raison quelconque, donc ma question est double:

1) Comment m'assurer qu'un ensemble de modifications est associé à une construction particulière?

2) Comment puis-je obtenir une liste des fichiers qui ont changé dans la branche depuis la dernière bonne compilation? J'ai la dernière construction construite avec succès mais je ne sais pas comment obtenir les fichiers sans vérifier les changesets (qui, comme mentionné ci-dessus ne sont pas associés à la construction!)

Répondre

9

Merci Scott,

Après un certain temps, j'ai trouvé une belle façon de gérer cela.

Fondamentalement, j'ai créé une tâche qui obtient les changesets actuels associés à la construction (le point 1 de ma question n'est pas un problème), puis boucle à travers eux à la recherche de fichiers .sql. Une fois que j'en ai la liste, je peux créer un script de modification ou les exécuter sur la base de données cible.

Le code ressemble à ceci:

TeamFoundationServer tfs = new TeamFoundationServer(TfsServerUrl); 
VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); 

var buildServer = (IBuildServer)tfs.GetService(typeof(IBuildServer)); 


IBuildDetail build = buildServer.GetBuild(
    new Uri(BuildUri) 
    , null 
    , QueryOptions.All 
); 

build.RefreshAllDetails(); 

var changesets = InformationNodeConverters.GetAssociatedChangesets(build); 

foreach (var changesetSummary in changesets) 
{ 
    Changeset changeSet = vcs.GetChangeset(changesetSummary.ChangesetId); 

    sqlFilePaths.AddRange(
     ProcessChangeSet(changeSet) 
    ); 

} 

et le code à l'intérieur ProcessChangeSet ressemble

List<string> sqlFilePaths = new List<string>(); 
foreach (Change change in changeSet.Changes) 
{ 

    if ((change.Item.ItemType == ItemType.File) 
     && (change.Item.ServerItem.EndsWith(".sql", StringComparison.OrdinalIgnoreCase)) 
     ) 
    { 
     sqlFilePaths.Add(
      sqlPath 
     ); 

    } 
} 
return sqlFilePathes; 

Mais si quelqu'un veut que je suis heureux de leur donner le code complet. Permet de s'assurer que les procédures stockées sont synchronisées sur le système. Cela ne laisse que des modifications de schéma à gérer manuellement dans ma base de données, ce que je suis heureux de faire.

0

Donc je peux comprendre l'attrait intuitif de cette approche, mais Je ne pense pas que ce soit la bonne façon d'y aller.

D'une part ça va être difficile. Mais le deuxième problème est que TFS n'a pas un bon moyen d'enregistrer les données de déploiement.

Pour la première question, je ne suis pas sûr de ce que cela signifie. Pour la deuxième question, vous pouvez utiliser les étiquettes de construction et la liste de l'histoire de tf aujourd'hui des fichiers modifiés. Comme alternative, vous pouvez reconsidérer comment vous voulez gérer les modifications SQL. J'utilise une méthode low-tech de garder les changements en attente en cours dans un répertoire, puis après le déploiement de déplacer les fichiers dans un répertoire différent. Cette méthode peut être améliorée en conservant une table d'historique de déploiement dans la base de données. Vous pouvez également regarder dans l'addition vsts DB, l'actuel CTP a beaucoup de nouvelles fonctionnalités autour de la gestion des changements de base de données. J'entends aussi que Red Gate a aussi de bons outils de gestion de base de données.

Questions connexes