【问题标题】:ADS 2019 - How to pass variables between build jobsADS 2019 - 如何在构建作业之间传递变量
【发布时间】:2020-07-30 18:04:59
【问题描述】:

使用 Azure DevOps Server 2019.1,我开始使用多个作业,以便将工作拆分到多个代理上。

流程本身运行良好。我是这样设置的

开始工作 - 这基本上测试了一些变量并更新了内部版本号

(取决于开始作业)RunTest 作业 - 运行“多配置”的作业,它拆分以逗号分隔的任务类别列表

(取决于 RunTest 作业)结束作业 - 链中新构建的触发构建任务

虽然作业依赖于另一个作业,但这似乎只会影响它们将开始的时间,它们将无法访问之前运行的作业提供的信息。

基本上我需要的是在开始作业中设置的变量的值(buildNumber)。 我在 RunTest 和 End Job 中需要这个版本号。 我怎样才能得到这些信息?我读过文章说这是不可能的,但还没有看到有效的解决方法。有没有人有一个体面的解决方法?

【问题讨论】:

    标签: azure-devops azure-devops-server-2019


    【解决方案1】:

    你试过multi job output variable:

    jobs:
    
    # 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
    

    【讨论】:

    • 我没有,如果我切换到 2019 年的文档,它会说这个设置多作业输出变量您不能将变量从一个作业传递到构建管道的另一个作业,除非您使用 YAML .
    • 你确定吗?我更改为 Azure DevopsServer 2019 并重新加载了该设置的页面并且它们可用。
    • 尝试切换到经典构建视图
    【解决方案2】:

    更新 2: 使用 YAML 应该是最简单的解决方案。如果您坚持使用经典构建视图。您可以尝试通过将值存储在文件(json、xml、yaml、您有什么)中来完成此操作,您可以直接使用或重新设置变量在 Job 中读取文件。

    当你排队下一次构建时,它不会影响源代码管理中的文件,默认值也不会改变。


    在同一阶段的作业之间传递变量,它需要使用输出变量。

    但是,根据thisusing outputs in a different job在经典 UI 格式中不受支持

    作为这种情况下的解决方法,您可以通过 Pipeline Variables 共享变量(在同一管道中的作业之间共享变量)。

    1.可以在管道变量中设置key变量:

    2.在您的第一份工作中添加一个包含以下内容的 Powershell 内联任务:

    $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/build/definitions/$($env:SYSTEM_DEFINITIONID)?api-version=5.0"
    
    Write-Host "URL: $url"
    
    $pipeline = Invoke-RestMethod -Uri $url -Headers @{
    
        Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
    
    }
    
    Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"
    
    
    
    # Update an existing variable to its new value
    
    $pipeline.variables.key.value = "value"
    
    
    
    ####****************** update the modified object **************************
    
    $json = @($pipeline) | ConvertTo-Json -Depth 99
    
    
    
    $updatedef = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
    
    
    
    write-host "==========================================================" 
    
    Write-host "The value of Varialbe key is updated to" $updatedef.variables.key.value
    
    write-host "=========================================================="
    

    3.运行管道我们可以发现key变量的值更新成功:

    因此您可以在第一个作业中运行 ps 脚本来更新 key 变量的值,然后所有后续作业都可以轻松访问更新后的变量。

    注意:

    1. 对于脚本本身,您只需更改行$pipeline.variables.key.value = "value"(必要)和Write-host "The value of Varialbe key is updated to" $updatedef.variables.key.value(可选)。

    如果我想将名为MyTest 的变量设置为值MyValue,则这两行应该是$pipeline.variables.MyTest.value = "MyValue"Write-host "The value of Varialbe MyTest is updated to" $updatedef.variables.MyTest.value

    1. 为了确保一个作业中的ps任务可以访问OAuth Token,我们应该Allow Scripts to Access OAuth Token。点击代理作业名称并选中复选框:

    1. 要使管道具有更新管道变量的权限(编辑构建管道),请转到管道安全为用户xxx(ProjectName) build service 设置Edit build pipeline 允许

    【讨论】:

    • 感谢您的冗长描述。但我不认为这是我想要的。我试过了。我有一个包含 2 个作业的构建,即运行您的脚本的开始作业,也创建了命名的管道变量。然后添加了另一个依赖于第一个工作的工作。这将运行 Write-Host "Key: $(Key)",它最终以 Key: DefaultValue 当我现在打开定义时,Key 的值是 "Value"。我不想在定义中保存这个值,我想将它传递给其他工作,而不是传递给将在此之后运行的其他构建。
    • @Nico 好的,明白你的意思。您需要的只是一个静态值。您可以尝试使用变量组。 docs.microsoft.com/en-us/azure/devops/pipelines/library/…
    • 不,我需要的是能够在作业 A 中生成一个值并将其传递给在作业 A 之后开始的作业 B。我希望更新构建中的标准管道变量之一会给这种效果,但作业 B 继续知道队列时间变量
    • @Nico 抱歉造成误会。使用 YAML 应该是最简单的解决方案。如果您坚持使用经典构建视图。您可以尝试通过将值存储在文件(json、xml、yaml、您有什么)中来完成此操作,您可以直接使用或重新设置变量在 Job 中读取文件。当你排队下一次构建时,它不会影响源代码管理中的文件,默认值不会改变。
    • 嗨 Nico,您对此问题还有其他顾虑吗?只是检查提供的信息是否有帮助。你能解决吗?
    猜你喜欢
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2020-03-03
    • 1970-01-01
    相关资源
    最近更新 更多