Azure devops ADS 2019-如何在构建作业之间传递变量

Azure devops ADS 2019-如何在构建作业之间传递变量,azure-devops,azure-devops-server-2019,Azure Devops,Azure Devops Server 2019,使用Azure DevOps Server 2019.1,我开始处理多个作业,以便将工作拆分到多个代理上 流本身运行良好。我有这样的设置 开始作业-这基本上是测试一些变量并更新buildnumber (取决于开始作业)运行测试作业-运行“多重配置”的作业,它将任务类别的逗号分隔列表 (取决于运行测试作业)结束作业-链中新生成的触发器生成任务 虽然作业依赖于另一个作业,但这似乎只会影响它们的启动时间,它们无法访问以前运行的作业提供的信息 基本上,我需要的是在Begin作业中设置的变量(buildN

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

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

开始作业-这基本上是测试一些变量并更新buildnumber

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

(取决于运行测试作业)结束作业-链中新生成的触发器生成任务

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

基本上,我需要的是在Begin作业中设置的变量(buildNumber)的值。 我需要在运行测试和结束作业中使用此版本号。 我怎样才能得到这个信息?我读过一些文章说这是不可能的,但还没有看到有效的解决方法。有人有合适的工作环境吗?

您是否尝试过:

您是否尝试过:

更新2: 使用YAML应该是最简单的解决方案。如果您坚持经典的构建视图。您可以通过将值存储在文件(json、xml、yaml等)中来实现这一点,您可以直接使用或重新设置变量来读取作业中的文件

当您对下一个生成排队时,它不会影响源代码管理中的文件,默认值也不会更改


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

但是,根据,在不同的作业中使用输出在经典UI格式中不受支持

作为此场景中的解决方法,您可以通过共享变量(在同一管道中跨作业共享变量)

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

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.运行管道,我们可以发现
变量的值已成功更新:

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

注意:

  • 对于脚本本身,只需更改行
    $pipeline.variables.key.value=“value”
    (必要)和
    Write host“Varialbe key的值更新为“$updatedef.variables.key.value
    (可选) 如果我想将名为
    MyTest
    的变量设置为value
    MyValue
    ,则行应该是
    $pipeline.variables.MyTest.value=“MyValue”
    Write host”,Varialbe MyTest的值将更新为“$updatedef.variables.MyTest.value

  • 为了确保一个作业中的ps任务可以访问
    OAuth令牌
    ,我们应该
    允许脚本访问OAuth令牌
    。单击代理作业名称并选中以下框:
  • 要使管道具有更新管道变量(编辑生成管道)的权限,请转到管道安全性,为用户
    xxx(ProjectName)生成服务设置
    edit build pipeline
    allow
  • 更新2: 使用YAML应该是最简单的解决方案。如果您坚持经典的构建视图。您可以通过将值存储在文件(json、xml、yaml等)中来实现这一点,您可以直接使用或重新设置变量来读取作业中的文件

    当您对下一个生成排队时,它不会影响源代码管理中的文件,默认值也不会更改


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

    但是,根据
    ,在不同的作业中使用输出在经典UI格式中不受支持

    作为此场景中的解决方法,您可以通过共享变量(在同一管道中跨作业共享变量)

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

    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.运行管道,我们可以发现
    变量的值已成功更新:

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

    注意:

  • 对于脚本本身,只需更改行
    $pipeline.variables.key.value=“value”
    (必要)和
    Write host“Varialbe key的值更新为“$updatedef.variables.key.value
    (可选) 如果我想将名为
    MyTest
    的变量设置为value
    MyValue
    ,则行应该是
    $pipeline.variables.MyTest.value=“MyValue”
    Write host”,Varialbe MyTest的值将更新为“$updatedef.variables.MyTest.value

  • 为了确保一个作业中的ps任务可以访问
    OAuth令牌
    ,我们应该
    允许脚本访问OAuth令牌
    。单击代理作业名称并选中以下框:
  • 要使管道具有更新管道变量(编辑生成管道)的权限,请转到管道安全性,为用户
    xxx(ProjectName)生成服务设置
    edit build pipeline
    allow

  • 我没有,如果我切换到2019文档,它会说这设置了一个多作业输出变量,除非使用YAML,否则无法将变量从构建管道的一个作业传递到另一个作业。确定吗?我改为Azure DevPSServer 2019,并重新加载了该设置的页面,这些设置都可用。尝试切换到经典构建视图我没有,如果切换到2019文档,它会显示这设置了一个多作业输出变量,您无法将变量从一个作业传递到另一个作业