2008-10-21 3 views
7

У меня есть несколько ветвей в TFS (dev, test, stage), и когда я объединяю изменения в ветку тестирования, я хочу, чтобы сценарий автоматической сборки и развертывания обнаруживал все обновленные файлы SQL и развертывал их в тестовую базу данных.Программно найти изменения TFS с момента последней хорошей сборки

Я думал, что смогу это сделать, найдя все изменения, связанные с сборкой с момента последней хорошей сборки, найдя все файлы sql в наборах изменений и развернув их. Однако по некоторым причинам у меня нет набора изменений, связанного со сборкой, поэтому мой вопрос двоякий:

1) Как обеспечить, чтобы набор изменений был связан с конкретной сборкой?

2) Как я могу получить список файлов, которые были изменены в ветке с момента последней хорошей сборки? У меня есть последняя успешно построенная сборка, но я не уверен, как получить файлы без проверки наборов изменений (которые, как упоминалось выше, не связаны со сборкой!)

ответ

9

Thanks Scott,

Через некоторое время я нашел хороший способ справиться с этим.

В основном я создал задачу, которая получает текущие изменения, связанные со сборкой (точка 1 моего вопроса не является проблемой), а затем перебирает их в поисках .sql-файлов. Как только у меня есть список тех, которые я могу создать сценарий изменений или выполнить их против целевой базы данных.

код выглядит примерно так:

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) 
    ); 

} 

и код внутри ProcessChangeSet выглядит

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; 

Но если кто-то хочет, чтобы я счастлив, чтобы дать им полный код. Обеспечивает синхронизацию хранимых процедур в системе. Это только оставляет изменения схемы для ручного управления в моей базе данных, которые я рад сделать.

0

Поэтому я могу понять интуитивную привлекательность этого подхода, но Я не думаю, что это правильный путь.

С одной стороны, это будет сложно. Но вторая проблема заключается в том, что у TFS нет хорошего способа записи данных развертывания.

Для первого вопроса, я не уверен, что это значит. Во втором вопросе вы можете использовать метки сборки и текущий список изменений tf истории.

В качестве альтернативы вы можете пересмотреть, как вы хотите управлять изменениями SQL. Я использую низкотехнологичный метод хранения текущих ожидающих изменений в одном каталоге, а затем после развертывания перемещения файлов в другой каталог. Этот метод можно улучшить, сохранив таблицу истории развертывания в базе данных. Вы также можете просмотреть вложение vsts DB, текущий CTP имеет множество новых функций, связанных с управлением изменениями базы данных. Я также слышал, что у Red Gate есть хорошие инструменты управления базами данных.