背景:我将 Bamboo 用于多个项目(业务需求)作为构建和部署控制器,并将 TFS 作为存储库。作为构建过程的一部分,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);
这样做让我例外,说映射确实存在:
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 拥有/运行。我不确定我错过了什么。
谢谢!