TFS 2015 构建:是否可以在存储库映射中使用变量?

TFS 2015 builds : Is it possible to use Variables in Repository mappings?

在 TFS 2015 上创建 vNext 构建时,您可以定义变量,然后在构建步骤中使用这些变量,也可以在构建运行的脚本中用作环境变量。

我正在处理的构建运行从映射位置提取文件的脚本,所以如果我可以定义一个变量并在映射中使用它就太好了,例如,如果我更新项目中的引用正在构建,我可以简单地用新位置更新变量,并让存储库映射和脚本从新位置正确提取,而无需在多个地方进行更改。

我已经尝试通过如下设置变量和映射来做到这一点, 但是,当您尝试保存构建时抱怨映射中有两个“$”字符,这会产生错误。有没有办法做到这一点,或者这目前不可能吗?

这是不可能的。正如错误消息中提到的那样:映射中有两个“$”字符。这意味着您的应用程序的路径不应因构建而异。

Mappings on the Repository page are used to specify source control folder which contains projects that need to be built in the build definition. You can set it via clicking the Ellipsis (...) button, however, you can't include variables in the mapping path.

还有一个类似的问题:

这也让我很生气。

对于初学者来说,有一个用户语音请求此功能。您可以在此处添加您的投票和输入以使 Microsoft 允许此功能:https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/14131002-allow-variables-in-repository-variables-and-trigg

其次,我们开发了一种解决方法,可以帮助我们完成大部分工作。它并不完美,但如果您愿意权衡取舍或可以解决不足之处,它可能对您有用。

首先关闭构建的 "Label Sources" 选项并将服务器路径字段映射到您的基础构建。您需要将自定义变量添加到构建定义,以告知构建实例从哪个 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)"

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

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

Publish Artifacts 任务在 Contents 字段和 Path 字段中使用 Branch 变量 目录中的示例

**$(Build.DefinitionName)$(Branch)\bin

标签代码任务使用以下命令

tf label "$(build.buildNumber)" "$/Team Project/Project1$(Branch)" /recursive

此设置的缺点是您不会将关联的更改和工作项捕获到您的子分支机构,因为服务器路径字段始终设置为主要位置。如果您总是在启动要投入生产的构建之前从您的分支机构合并到您的主要位置,这可能不是问题。您可以做些什么来弥补这一点实际上取决于您的用例。

通过一些调整,如果需要,您也可以使用相同的格式来指定完整路径。