TFS工作区“尝试获取映射时出错”

时间:2014-08-13 21:04:02

标签: tfs msbuild workspace bamboo mappings

背景:我将Bamboo用于多个项目(业务需求)作为构建和部署控制器,TFS作为repo。作为构建过程的一部分,TFS插件为构建服务器上的项目创建工作空间。映射是有效和正确的:

Owner: CORP\TFSSERVICE
Workspace Name : Bamboo_BLUEM-BLUE-JOB1_9c48a010_TEST-BAMBOO
Source Folder: $/Project/Monitoring
Local Folder : C:\bamboo-home\xml-data\build-dir\BLUEM-BLUE-JOB1\builds\sources\Project\Monitoring

这适用于执行GETS和构建。然而,副作用(来自TFS插件,我假设)是文件在本地拉出时的时间戳。我需要时间戳来匹配它们的来源。

我可以在纯TFS / MSbuild(非竹子)环境中执行此操作,并执行以下预构建步骤:

workspace = versionCtrlSrvr.GetWorkspace(strSourcePath);
ItemSet itemSet = versionCtrlSrvr.GetItems(strSourcePath, RecursionType.Full);
foreach (Item item in itemSet.Items)
{
   string localPath = workspace.GetLocalItemForServerItem(item.ServerItem);
   if (item.ItemType == ItemType.File)
   {
      ProcessFile(item, localPath);
   }
   else if (item.ItemType == ItemType.Folder)
   {
      ProcessDirectory(item, localPath);
   }
}
 private static void ProcessFile(Item itemTFS, string localPath)
 {
    //change FileInfo modify time
 }
 private static void Processdirectory(Item itemTFS, string localPath)
 {
    //change FileInfo modify time
 }

但是,当我在Bamboo服务器上运行此代码时,GetWorkspace会抛出异常:

Error trying to get mapping :
There is no working folder mapping for 
C:\bamboo-home\xml-data\build-dir\BLUEM-BLUE-JOB1\builds\sources\Project\Monitoring

事实并非如此,Sidekick可以证实这一点。

但是由于错误说不存在映射,我尝试使用以下代码创建另一个映射:

Console.WriteLine("Creating temporary workspace mapping : tempDLworkspace");
workspace = VersionControlServer.CreateWorkspace("tempDLworkspace");
WorkingFolder workfolder = new WorkingFolder(
@"$/Project/Monitoring", 
@"C:\bamboo-home\xml-data\build-dir\BLUEM-BLUE-JOB1\builds\sources\Project\Monitoring");
workspace.CreateMapping(workfolder);

这样做让我有一个例外,说实际上存在映射DOES:

Creating temporary workspace mapping : tempDLworkspace
Download completed with errors.   LastError : 
Error downloading file. The working folder 
C:\bamboo-home\xml-data\build-dir\BLUEM-BLUE-JOB1\builds\sources\Project\Monitoring
is already in use by the workspace 
Bamboo_BLUEM-BLUE-JOB1_9c48a010_TEST-BAMBOO;CORP\TFSSERVICE
on computer TEST-BAMBOO.

所以最后,我无法阅读映射,因为我告诉它不存在,而且由于现有的映射,我无法创建新的映射!我不确定为什么这不起作用。


编辑 - 我可以通过调用重写的.GetWorkspace()方法来获取工作区对象:

workspaceName =@"C:\bamboo-home\xml-data\build-dir\BLUEM-BLUE-JOB1\builds\sources\Project\Monitoring";
workspace = VersionControlServer.GetWorkspace(workspaceName, @"CORP\TFSSERVICE");

这让我获得了理想的结果,但要求我知道Bamboo为工作区提供的名称。我仍然希望能够仅从本地路径获取工作空间定义。构建,时间戳和工作空间都由同一身份TFSSERVICE拥有/运行。我不确定我错过了什么 谢谢!

2 个答案:

答案 0 :(得分:0)

您使用的是哪个版本的TFS?在2012 +您可以通过选项

进行设置

有关详细信息,请参阅此帖中的答案 timestamp when Getting Latest from TFS and does it matter?

答案 1 :(得分:0)

每次构建时都删除映射吗?如果插件每次使用相同的路径运行时都在创建工作空间映射,则会出现“工作空间已存在”错误。如果是,请添加最终任务以删除工作区。这将确保下次运行此作业时没有映射。