我在TFS中有几个分支(开发,测试,阶段),当我将更改合并到测试分支时,我希望自动构建和部署脚本找到所有更新的SQL文件并将它们部署到测试数据库。
我认为我可以通过查找自上一次良好构建以来与构建相关联的所有变更集,查找变更集中的所有sql文件并部署它们来实现此目的。但是我似乎没有因为某种原因而将变更集与构建相关联,所以我的问题是双重的:
1)如何确保变更集与特定版本相关联?
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)