背景:我将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拥有/运行。我不确定我错过了什么 谢谢!
答案 0 :(得分:0)
您使用的是哪个版本的TFS?在2012 +您可以通过选项
进行设置有关详细信息,请参阅此帖中的答案 timestamp when Getting Latest from TFS and does it matter?
答案 1 :(得分:0)
每次构建时都删除映射吗?如果插件每次使用相同的路径运行时都在创建工作空间映射,则会出现“工作空间已存在”错误。如果是,请添加最终任务以删除工作区。这将确保下次运行此作业时没有映射。