以编程方式查找自上次良好构建以来的TFS更改

时间:2008-10-21 04:58:49

标签: tfs msbuild msbuild-task

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

我认为我可以通过查找自上一次良好构建以来与构建相关联的所有变更集,查找变更集中的所有sql文件并部署它们来实现此目的。但是我似乎没有因为某种原因而将变更集与构建相关联,所以我的问题是双重的:

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

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

2 个答案:

答案 0 :(得分:9)

感谢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;

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

答案 1 :(得分:0)

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

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

对于第一个问题,我不确定这意味着什么。对于第二个问题,您可以使用构建标签和今天的历史记录列表更改文件。

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