【问题标题】:Delete build definitions in TFS via API通过 API 删除 TFS 中的构建定义
【发布时间】:2015-02-10 01:45:27
【问题描述】:

通过 API 创建 TFS 构建定义时,如果定义预先存在,我需要先删除:

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)

正如您在第一个 sn-p 中看到的,我尝试使用 .Workspace.RemoveMapping() 删除工作区没有任何效果。工作区仍然存在于构建控制器上。我可以手动删除它们,但是当我删除构建定义时它们确实应该被删除。 API中是否还有其他DeleteWorkspace()机制?

更完整的代码要点在这里:https://gist.github.com/grenade/cce374cb4e27e366bc5b

【问题讨论】:

    标签: api build


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2013-07-12
      • 2011-08-09
      • 2015-10-10
      • 1970-01-01
      • 2016-04-25
      • 2011-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多