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

时间:2020-04-17 09:28:26

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

使用Azure DevOps Server 2019.1,我开始使用多作业,以允许我将工作分为多个代理。

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

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

(取决于Begin作业)RunTest作业-运行“多配置”的作业,该作业将分割逗号分隔的任务类别列表

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

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

基本上,我需要的是已在Begin Job中设置的变量的值(buildNumber)。 我需要在RunTest和End Job中使用此版本号。 我如何获得此信息?我阅读了无法做到的文章,但尚未看到有效的解决方法。有人有不错的解决方法吗?

2 个答案:

答案 0 :(得分:0)

您尝试过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

答案 1 :(得分:0)

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

当您排队下一个版本时,它不会影响源代码管理中的文件,并且默认值也不会更改。


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

但是,根据this经典UI格式不支持using outputs in a different job

作为此方案中的解决方法,您可以通过Pipeline Variables共享变量(在同一管道中的各个作业之间共享变量)。

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

enter image description here

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变量的值已成功更新:

enter image description here

因此,您可以在第一个作业中运行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。单击代理人的作业名称,然后选中框:

enter image description here

  1. 要启用管道有权更新管道变量(编辑构建管道),请通过管道安全性为用户Edit build pipeline设置xxx(ProjectName) build service 允许

enter image description here