TFS 2015构建:在仓库映射中使用变量是否可行?

7
在TFS 2015上创建vNext构建时,您可以定义变量,然后在构建步骤中使用这些变量,并且还可以将其用作构建运行的脚本中的环境变量。
我正在处理的构建运行从映射位置拉取文件的脚本,因此如果我可以定义一个变量并在映射中使用它,那就太好了。例如,如果我更新正在构建的项目中的引用,我只需更新新位置的变量,就可以使存储库映射和脚本从新位置正确地拉取,而无需在多个位置进行更改。
我已经尝试通过以下方式设置变量和映射来实现这一点: enter image description here enter image description here 但是,当您尝试保存构建时,会生成一个错误,指出映射中有两个“$”字符。是否存在实现此操作的方法或者目前不可能实现?
2个回答

5
这也困扰我很长时间了。
首先,有一个用户请求这个功能。您可以在此处添加您的投票和意见以让 Microsoft 允许此功能:https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/14131002-allow-variables-in-repository-variables-and-trigg 其次,我们已经开发出一个解决方法,可以解决大部分问题。虽然不完美,但如果您可以接受这种权衡或可以解决缺陷,那么这对您可能会有用。
首先,关闭构建的“标记来源”选项,并将服务器路径字段映射到您的基本构建。您需要向构建定义添加一个自定义变量,告诉构建实例从哪个 TFS 位置提取。例如,我们有一个基本项目,然后是该项目的多个分支,因此我们的源结构如下:
$\Team Project\Project1
$\Team Project\Project1Branch1
$\Team Project\Project1Branch2
$\Team Project\Project1Branch3

我们创建了一个名为“Branch”的变量,可以将其设置为“Branch1”,“Branch2”等。

当我们想要构建基础项目时,在启动构建时留空“Branch”变量。对于分支构建,我们将其设置为要构建的分支的名称。

然后,我们的构建步骤如下:

  • 将工作区文件夹映射到分支文件夹
  • 获取指定分支的文件-在重新映射工作区后,我们必须手动执行此操作
  • 编译指定分支的源代码
  • 从指定分支发布构建成果物
  • 手动标记指定分支的代码

Remap任务运行以下命令

tf workfold "$/Team Project/Project1$(Branch)" "$(build.sourcesDirectory)\$(Build.DefinitionName)$(Branch)"

手动获取任务运行以下命令。
get /recursive /noprompt "$/Team Project/Project1$(Branch)"

该构建使用分支变量将指向特定分支解决方案文件的正确位置

$(build.sourcesDirectory)\$(Build.DefinitionName)$(Branch)\SolutionFile.sln

发布构件任务在“内容”字段和“路径”字段都使用分支变量。 例如,对于“内容”字段:
**\$(Build.DefinitionName)$(Branch)\bin

标签代码任务使用以下命令。
tf label "$(build.buildNumber)" "$/Team Project/Project1$(Branch)" /recursive

这种设置的缺点是,由于“服务器路径”字段始终设置为主位置,因此您无法捕获相关更改和工作项到您的子分支。如果您总是在启动旨在进入生产的构建之前从您的分支合并到主位置,则这可能不是问题。要补偿此问题,你可以根据你的用例进行某些调整。
如果需要,您可以通过一些调整来使用相同的格式指定完整路径。

你在 VSTS 的限制下以优雅的方式解决了问题。然而,使用这种方法存在性能问题。我们有相当多的发布分支,在构建之前必须检查所有内容,我认为这会相当慢。 - dynamokaj
谢谢你的赞美。当你说“在构建之前必须检查所有内容”时,我不确定你指的是什么。在这种情况下,检查文件是不必要的(尽管我们的构建有一个检出操作,但对于这个问题来说并不必要,我只是忽略了删除对它们的引用,现在也没有看到它们)。 - mattbbpl
经过一段时间的思考,我认为您所提到的是每个分支上的“Get”操作。如果是这样,请不用担心 - 上面的解决方案仅从主位置(服务器路径字段中的路径)和由“Branch”变量指定的特定分支中“获取”源代码。因此,虽然它确实会“获取”一个不必要的分支,除非它特别是主要构建,但仅有一个 - 它不会“获取”解决方案中的每个分支。 - mattbbpl

3
这是不可能的。就像错误信息所提到的那样:映射中有两个“$”字符。这意味着您的应用程序路径不能因构建而异。
仓库页面上的映射用于指定包含需要在构建定义中构建的项目的源代码控制文件夹。您可以通过单击省略号(...)按钮来设置它,但是无法在映射路径中包含变量。
有一个类似的问题:Variables in TFS Mappings on Visual Studio Online Team Builds

3
你对函数的理解是正确的,但是关于路径在构建之间不应该改变的论断是错误的。在开发过程中通常会有多个环境,构建这些环境的过程理想情况下应该是相同的。如果手动输入这些单独的子树/分支,那么这将成为失败的点,并且将构建环境混淆为具有完全相同功能的重复条目。这就像在诸如客户地址之类的数据库中输入重复数据一样,是一个严重的设计缺陷。 - user2197169

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接