在 VSTS 16.131.28601.4 中在 TaskGroup 中传递构建/部署任务之间的变量

33次阅读
没有评论

问题描述

在一个多配置的Web应用程序中使用并行部署,并利用任务组(Task Group)来重用他的部署代码。他在使用Powershell任务和 ##vso[task.setvariable variable] 时遇到了一个问题:这些变量只能被其他任务(尤其是非PowerShell任务)读取,如果它们对应于构建/发布级别的顶级变量。而对于仅限于任务组内的本地变量,其他任务无法读取。这个问题在 Issue #3116 中有描述。除了将所有变量直接绑定到具有相同名称的根变量之外,是否有更好的解决方法?

解决方案

请注意以下操作可能受到版本差异影响,建议在操作前备份。

方案1:使用持久化存储

在处理 Task Group 内传递变量时,一种可行的方法是使用持久化存储,如 Azure Table Storage 或 Cosmos DB,来存储需要在各个阶段之间保留的键值对。以下是具体步骤:

  1. 选择持久化存储:根据你的需求,选择一个适合的持久化存储,比如 Azure Table Storage 或 Cosmos DB。

  2. 定义键值对模式:为了保留变量,你可以定义一个模式,例如:

  3. 键(Key)buildNum-variableName

  4. 值(Value)variableValue

  5. 编写封装代码:为了访问存储的键值对,你可以编写相应的封装代码,供 PowerShell 和 MSBuild 使用。这可以在任务中调用。这也有助于在多个构建之间创建持续集成/持续交付(CI/CD)流水线。

方案2:自定义脚本

另一种方法是使用自定义脚本来处理变量传递。你可以编写脚本来从一个任务中提取变量,然后将其传递给其他任务。以下是一个示例脚本(PowerShell):

# 从环境变量中获取 Task Group 内部设置的变量
$customVariable = $env:MY_CUSTOM_VARIABLE

# 在需要的任务中使用变量
Write-Host "Custom Variable Value: $customVariable"

# 调用其他任务,将变量传递给它们
# 注意:这可能需要根据具体的任务和环境进行调整

你可以在适当的地方调用此脚本,以确保变量在不同的任务之间传递。

方案3:使用通用变量

如果你想要避免在各个任务之间手动传递变量,你可以考虑将变量定义为通用变量(Pipeline Variables)。这将使变量在整个构建/发布过程中可见。以下是操作步骤:

  1. 打开你的构建/发布流水线。
  2. 导航到“Variables”(变量)选项卡。
  3. 定义你需要在 Task Group 内共享的变量。
  4. 在 Task Group 中,可以直接引用这些通用变量。

无论哪种方案,你都可以根据你的需求和项目结构选择适合的方法来在 Task Group 内传递变量。

请注意,上述解决方案可能会因不同版本的工具和平台而有所不同。在实际操作之前,务必参考相关文档,并在测试环境中进行验证。

正文完