2015-02-09 44 views
0

當創建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(),但沒有任何效果。工作區仍然存在於構建控制器上。我可以手動刪除它們,但是當我刪除構建定義時,它們確實應該被刪除。 API中有其他一些DeleteWorkspace()機制嗎?

更完整的代碼要點是在這裏:https://gist.github.com/grenade/cce374cb4e27e366bc5b

回答

1

事實證明,它是複雜的原因是,通過構建創建的各種工作區的所有者可能是一些其他用戶(即生成代理下運行) 。 我發現了一種方法,依靠其在工作區的命名約定[build definition id]_[build agent id]_[workspace host]使用以前的版本定義ID做到這一點:

var workspaceNamePrefix = string.Concat(buildDefinition.Id, '_'); 
var workSpaces = VersionControlServer.QueryWorkspaces(null, null, null).Where(w => w.Name.StartsWith(workspaceNamePrefix)).ToArray(); 
for (var i = workSpaces.Count() - 1; i > -1; i--) 
{ 
    try 
    { 
     workSpaces[i].Delete(); 
     Console.WriteLine("delete workspace: {0}", workSpaces[i].Name); 
    } 
    catch (ResourceAccessException rae) 
    { 
     Console.ForegroundColor = ConsoleColor.Yellow; 
     Console.WriteLine(rae.Message); 
     Console.ForegroundColor = ConsoleColor.Red; 
     Console.WriteLine("workspace needs to be deleted by an administrator using the following command:"); 
     Console.ForegroundColor = ConsoleColor.Green; 
     Console.WriteLine("tf workspace /delete {0};{1}", workSpaces[i].Name, workSpaces[i].OwnerName); 
     Console.ResetColor(); 
    } 
} 

我已經更新要點:https://gist.github.com/grenade/cce374cb4e27e366bc5b