【问题标题】:How to use output variables across agent jobs in azure release pipeline如何在 Azure 发布管道中跨代理作业使用输出变量
【发布时间】:2019-10-24 07:41:38
【问题描述】:

在我的 azure 发布管道中,我有 2 个代理作业,一个用于使用 power-shell 的 sql 部署,另一个用于使用 power-shell 的 kubernetes。 如何在第一个代理作业中设置输出变量,并在第二个代理作业中使用 power-shell。

【问题讨论】:

    标签: azure azure-devops devops azure-devops-rest-api azure-devops-extensions


    【解决方案1】:

    使用

    Write-Output "##vso[task.setvariable variable=testvar;isOutput=true;]testvalue"
    

    然后引用输出变量,就好像它存在于未来的任务中一样。

    $(taskreference.testvariable)
    

    任务引用名称可以在powershell脚本任务的输出部分设置:

    但是当我阅读文档时,似乎还没有跨工作参考:

    待办事项

    我不确定我们将如何生成作业引用名称,因为此时我们没有作业链接。

    应该是这样的:

    {DefinitionName}_{JobName}
    

    见:Azure-Pipelines-Agent/docs/Outputvariable.md

    所以现在这个变量只能在同一个 Job 中起作用。

    It does look like YAML build do already support cross-phase output variable references.

    工作:

    # Set an output variable from job A
    - job: A
      pool:
        vmImage: 'vs2017-win2016'
      steps:
      - powershell: echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]this is the value"
        name: setvarStep
      - script: echo $(setvarStep.myOutputVar)
        name: echovar
    
    # Map the variable into job B
    - job: B
      dependsOn: A
      pool:
        vmImage: 'ubuntu-16.04'
      variables:
        myVarFromJobA: $[ dependencies.A.outputs['setvarStep.myOutputVar'] ]  # map in the variable
                                                                              # remember, expressions require single quotes
      steps:
      - script: echo $(myVarFromJobA)
        name: echovar
    

    【讨论】:

    • 这可能行得通。我不能 100% 确定它在发布阶段是否有效。
    • 怎么消费,这里的taskreference是什么??
    • 添加了更多指导。我在isOutput=true; 之后错过了;,代理可能很挑剔,所以先试试吧。文档在跨作业输出变量是否有效方面存在冲突。文档清楚地说明了在使用新的 YAML 构建格式时如何进行这项工作。基于 UI 的文档声明此功能仍为 TODO。自己试试吧。
    • 我试过了,它可以在同一个工作中工作,但不要跨越另一个工作。无论如何,非常感谢。
    • 您能否更具体地了解如何在任务引用名称中设置它?并在此处发布您的答案stackoverflow.com/questions/59369619/…
    【解决方案2】:

    如何在 Azure 发布管道中跨代理作业使用输出变量

    恐怕目前无法直接跨代理作业使用输出变量。

    有一个相关问题Variables set via logging commands are not persistent between agents,您可以跟进。

    要解决此问题,您可以尝试以下解决方法

    • 在发布定义变量中定义一个变量。
    • 使用 REST API (Definitions - Update) 更新发布值 代理作业 1 中的定义变量。
    • 在下一个代理作业中使用发布定义变量的更新值。

    有关使用 REST API 更新发布定义变量的值的详细信息,您可以按照以下票证:

    How to modify Azure DevOps release definition variable from a release task?

    希望这会有所帮助。

    【讨论】:

    • 非常感谢.. 请指导我如何在下一份工作中使用 powershell 使用该变量。我试过 $env:variableName, $(variableName), ${env:variableName} 但不能通过 powershell 工作。
    • $(variableName) 应该可以工作。是否从发布定义变量中获取了值?
    • 了解到非常奇怪的行为,即变量必须全部为大写,然后只有我才能在 Linux 上获得该值。试过 echo "hint is $env:VARIABLENAME" 并且它有效。有什么我可以尝试的,所以它适用于两种情况??
    • 是的,它的发布定义变量。
    • @VatanSoni,我们可以将秘密值作为 $(variableName) 从您的构建步骤显式使用到脚本或程序中,但我们无法在我们的任务中显示它。 stackoverflow.com/questions/50110315/…
    猜你喜欢
    • 2020-04-09
    • 1970-01-01
    • 2021-06-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2019-04-29
    相关资源
    最近更新 更多