使用Azure DevOps Server 2019.1,我开始使用多作业,以允许我将工作分为多个代理。
流程本身运行良好。我有这样的设置
开始作业-这基本上测试了一些变量并更新了内部版本号
(取决于Begin作业)RunTest作业-运行“多配置”的作业,该作业将分割逗号分隔的任务类别列表
(取决于RunTest作业)结束作业-链中新构建的触发器构建任务
虽然这些作业依赖于另一个作业,但这似乎只影响它们的开始时间,而他们将无法访问之前运行的作业所提供的信息。
基本上,我需要的是已在Begin Job中设置的变量的值(buildNumber)。 我需要在RunTest和End Job中使用此版本号。 我如何获得此信息?我阅读了无法做到的文章,但尚未看到有效的解决方法。有人有不错的解决方法吗?
答案 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
变量:
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
变量的值,然后所有下一个作业都可以轻松访问更新后的变量。
注意:
$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
。
OAuth Token
,我们应该Allow Scripts to Access OAuth Token
。单击代理人的作业名称,然后选中框:Edit build pipeline
设置xxx(ProjectName) build service
允许。