7

我在 TFS 中有几个分支(开发、测试、阶段),当我将更改合并到测试分支中时,我希望自动构建和部署脚本找到所有更新的 SQL 文件并将它们部署到测试数据库。

我想我可以通过查找自上次良好构建以来与构建相关的所有变更集,找到变更集中的所有 sql 文件并部署它们来做到这一点。但是,由于某种原因,我似乎没有与构建相关的变更集,所以我的问题是双重的:

1) 如何确保变更集与特定构建相关联?

2) 如何获取自上次良好构建以来分支中已更改的文件列表?我有最后一次成功构建的构建,但我不确定如何在不检查变更集的情况下获取文件(如上所述,它与构建无关!)

4

2 回答 2

9

谢谢斯科特,

过了一会儿,我找到了一个很好的方法来管理这个。

基本上,我创建了一个任务,它获取与构建相关的当前变更集(我的问题的第 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;

但是如果有人想要我很乐意给他们完整的代码。确保存储过程在整个系统中保持同步。这只会让架构更改在我的数据库中手动管理,我很乐意这样做。

于 2008-10-31T09:02:32.270 回答
0

所以我可以理解这种方法的直观吸引力,但我认为这不是正确的方法。

一方面,这将是困难的。但第二个问题是 TFS 没有记录部署数据的好方法。

对于第一个问题,我不确定这意味着什么。对于第二个问题,您可以使用已更改文件的构建标签和 tf history today 列表。

作为替代方案,您可以重新考虑如何管理 SQL 更改。我使用一种低技术方法将当前未决更改保存在一个目录中,然后在部署后将文件移动到另一个目录。可以通过在数据库中保留部署历史记录表来增强此方法。您可能还想了解 vsts DB 的补充,当前的CTP有很多关于管理数据库更改的新功能。我还听说Red Gate也有很好的数据库管理工具。

于 2008-10-23T13:18:51.530 回答