При создании TFS построения определений через API, мне нужно сначала удалить, если определение предварительно существует:Удалять определения сборки в TFS через API
if (BuildServer.QueryBuildDefinitions(teamProject).Any(d => d.Name == buildDefinitionName))
{
buildDefinition = BuildServer.GetBuildDefinition(teamProject, buildDefinitionName);
var builds = BuildServer.QueryBuilds(buildDefinition);
if (builds != null && builds.Any())
{
Console.WriteLine("delete {0} builds for build definition: {1}", builds.Count(), buildDefinition.Name);
BuildServer.DeleteBuilds(builds);
}
if (buildDefinition.Workspace.Mappings.Any())
{
var mappings = buildDefinition.Workspace.Mappings.Select(m => m.ServerItem).ToArray();
foreach (var mapping in mappings)
{
Console.WriteLine("remove workspace mapping: {0}", mapping);
buildDefinition.Workspace.RemoveMapping(mapping);
}
}
Console.WriteLine("delete build definition: {0}", buildDefinition.Name);
BuildServer.DeleteBuildDefinitions(new[] { buildDefinition });
}
Это работает, как это делает последующее:
buildDefinition = BuildServer.CreateBuildDefinition(teamProject);
buildDefinition.Name = buildDefinitionName;
Однако, когда первая сборка получает бежать, он выдает ошибку о конфликтующих рабочих пространствах:
Exception Message: Unable to create the workspace 'some-new-workspace' due to a mapping conflict. You may need to manually delete an old workspace. You can get a list of workspaces on a computer with the command 'tf workspaces /computer:%COMPUTERNAME%'.
Details: The path C:\some-path is already mapped in workspace some-old-workspace. (type MappingConflictException)
вы можете увидеть в первом фрагменте, моя попытка удалить рабочие области с .Workspace.RemoveMapping()
, не имеет никакого эффекта. Рабочие пространства все еще существуют на контроллере сборки. Я могу удалить их вручную, но они действительно должны быть удалены, когда я удалю определение сборки. Есть ли другой механизм DeleteWorkspace()
в API?
Более полный код суть здесь: https://gist.github.com/grenade/cce374cb4e27e366bc5b