Программно найти изменения TFS с момента последней хорошей сборки - PullRequest
7 голосов
/ 21 октября 2008

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

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

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

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

Ответы [ 2 ]

9 голосов
/ 31 октября 2008

Спасибо, Скотт,

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

В основном я создал задачу, которая получает текущие наборы изменений, связанные со сборкой (пункт 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 голосов
/ 23 октября 2008

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

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

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

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

...