【问题标题】:AzureDevOp convey information from one stage to another using scriptsAzureDevOp 使用脚本将信息从一个阶段传递到另一个阶段
【发布时间】:2019-10-11 10:56:26
【问题描述】:

我有一个定义了两个步骤的管道:

  • 一个从两个单独的工件构建组合舵图
  • 两个将此图表部署到集群

两个阶段首先加载一个秘密,然后运行一个 bash 脚本来完成工作,如下图所示。

我现在的挑战是,将 helm chart 名称及其版本从 Build 阶段提交到 Deploy 阶段。这样第二步就可以获取到正确的图表了。

我怎样才能做到这一点?


试用 1:使用 ##vso[task.setvariable - 脚本无效

echo "##vso[task.setvariable variable=HELM_CHART_NAME]$HELM_CHART_NAME"
echo "##vso[task.setvariable variable=HELM_CHART_VERSION]$HELM_CHART_VERSION"

【问题讨论】:

  • 尝试与本教程分享变量:nganmenegay.com/2019/04/25/…
  • 阶段应该相互独立。为什么需要分两个阶段来做这件事?
  • 嗨,现在情况如何?以下两种方法是否可以帮助您实现跨阶段传递变量?
  • @MerlinLiang-MSFT 我恢复为从头开始构建所有内容,因此我避免传递数据
  • @lony 好的,但这似乎需要更长的时间。如果方便,您可以将您的解决方案转换为答案然后接受它:-)

标签: azure-devops azure-pipelines-release-pipeline


【解决方案1】:

使用##vso[task.setvariable - 脚本无效

这是不同阶段使用不同代理造成的,##vso[task.setvariable设置的动态变量只是一个agent-scoped变量。它的生命周期与代理相同,因此一旦代理工作完成,它就会消失。

对于可以帮助您实现从 Build 阶段传递变量到 Deploy 阶段的解决方案,您最好将这些变量存储在一个存储中。例如将其与任务Azure Key Vault actionsWrite Secrets to Key Vault 一起存储在Azure Key Vault 中。

另一种方法是使用 rest api 将其添加为带有 powershell 脚本的发布变量:

PUT https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/{releaseId}?api-version=5.0

然后,在下一阶段,它可以从 Release Variables 访问和获取变量。

【讨论】:

  • 那么 Azure DevOps 内部没有机制?
  • @lony 直到现在,没有。因为按照最初的设计,代理工作应该相互独立。这也是丹尼尔在评论中提到的。我们提供存储作为解决方法,让用户可以实现一些特殊情况,例如第二个代理作业需要使用从前一个代理作业生成的一个变量。
  • 将两个工件组合成新的东西(又名掌舵图)然后将其部署到不同阶段是不典型的吗?那么我该如何正确地做到这一点呢?
  • @lony 是的,通常是这样。大多数时候,我们在变量选项卡中预定义这些变量,然后在适当的位置使用它们。但也有局限性。其实你的步骤没有任何问题,把bash脚本替换成我在回答中提到的方法:将变量添加到azure key vault中,或者添加到release变量中。到目前为止,受独立代理作业设计的限制,无法直接实现传递变量。
  • @lony 我们将其设计为独立的,只是确保每个部署环境清晰,不会相互影响。但这还有另一个缺点,那就是您面临的问题。要实现新变量共享,必须使用一个所有环境都可以访问的第三方存储。
最近更新 更多