有没有一种方法可以在Azure DevOps中循环所有来自stageprocedencies的输出?

drkbr07n  于 2023-11-21  发布在  其他
关注(0)|答案(2)|浏览(118)

我想循环所有相关阶段的输出,并检查是否有任何一个被设置为一个特定的值,这将表明有问题。这是可能的,如果是这样,怎么做?
除了在工作环境中使用stageDependencies之外,我很难找到任何有关stageDependencies的相关文档。我知道下面的代码不起作用,但我已经尝试了一些变体,我甚至没有看到stageDependencies对象。

  1. - task: PowerShell@2
  2. displayName: Check for Failures
  3. inputs:
  4. targetType: inline
  5. script: |
  6. foreach ($dependency in $[stageDependencies]) {
  7. foreach ($job in $dependency) {
  8. foreach ($output in $job.outputs) {
  9. if ("$output" -eq "Started") {
  10. write-host "##vso[task.logissue type=error]Task failed in a previous step"
  11. }
  12. }
  13. }
  14. }

字符串

xwbd5t1u

xwbd5t1u1#

还需要从前面的阶段中获取所有变量的列表,结果通过在管道中将stageDependencies转换为JSON,然后在Powershell中返回到对象来解决问题。
下面是一个流水线的例子,它在第一阶段设置了两个变量,并在第二阶段通过初始变量名someVariableanother.variable.with.dots读取它们,而不需要使用阶段/作业/步骤名称。

  1. trigger:
  2. - master
  3. stages:
  4. - stage: SetVars
  5. jobs:
  6. - job: SetVarsJob
  7. steps:
  8. - script: echo "##vso[task.setvariable variable=someVariable;isOutput=true]firstVarValue"
  9. - script: echo "##vso[task.setvariable variable=another.variable.with.dots;isOutput=true]secondVarValue"
  10. - stage: ReadVars
  11. dependsOn: SetVars
  12. jobs:
  13. - job: ReadVars
  14. variables:
  15. stageDependenciesSerialized: $[convertToJson(stageDependencies)]
  16. steps:
  17. - powershell: |
  18. # extract only initial variables as hashtable
  19. function ExtractHashtableByVariableNames {
  20. param ( [Parameter(Position=0)] [string] $stageDependenciesJson )
  21. $result = @{}
  22. $stageDependencies = $stageDependenciesJson | ConvertFrom-Json
  23. foreach($stage in $stageDependencies.psobject.Properties) {
  24. foreach($job in $stage.Value.psobject.Properties) {
  25. foreach($step in $job.Value.outputs.psobject.Properties) {
  26. $varName = $step.Name.Substring($step.Name.IndexOf('.') + 1)
  27. $result[$varName] = $step.Value
  28. }
  29. }
  30. }
  31. return $result
  32. }
  33. $myHashtable = ExtractHashtableByVariableNames '$(stageDependenciesSerialized)'
  34. Write-Host $myHashtable["someVariable"]
  35. Write-Host $myHashtable["another.variable.with.dots"]

字符串
在它打印的结果中

  1. firstVarValue
  2. secondVarValue

展开查看全部
svujldwt

svujldwt2#

管道可以通过logging命令输出变量,但变量只能是字符串:
https://learn.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#set-variables-in-scripts
此方法设置的所有变量都被视为字符串。
解析字符串并将其放入数组并不难,只需使用字符串类型附带的函数(split())来拆分和恢复即可。
下面是一个示例:

  1. trigger:
  2. - none
  3. # 1
  4. stages:
  5. - stage: s1
  6. displayName: setvars
  7. jobs:
  8. - job: testJob
  9. steps:
  10. - task: PowerShell@2
  11. name: setvar
  12. inputs:
  13. targetType: 'inline'
  14. script: |
  15. # logic here. For example you get the vars and put it into this format:
  16. $testvars = "testvar1,testvar2,testvar3"
  17. Write-Host "##vso[task.setvariable variable=outputvars;isOutput=true]$testvars"
  18. # 2
  19. - stage: s2
  20. displayName: getvars
  21. dependsOn: s1
  22. variables:
  23. vars: $[ stageDependencies.s1.testJob.outputs['setvar.outputvars'] ]
  24. jobs:
  25. - job:
  26. steps:
  27. - task: PowerShell@2
  28. inputs:
  29. targetType: 'inline'
  30. script: |
  31. $varsArr = "$(vars)".Split(',')
  32. foreach ($var in $varsArr)
  33. {
  34. Write-Host "$var`r`n"
  35. if($var -eq 'testvar1')
  36. {
  37. Write-Host 'The value is correct.'
  38. }
  39. }

字符串
测试结果:


的数据

展开查看全部

相关问题