gpt4 book ai didi

Azure Devops yaml管道,如何将foreach中的一系列步骤合并为一个步骤

转载 作者:行者123 更新时间:2023-12-03 04:52:44 25 4
gpt4 key购买 nike

tldr

现在验证模板创建任务列表

steps:
- ${{ each dependsOnVariable in parameters.dependsOnVariables }}:

问题:有没有办法调整模板逻辑,将所有检查合并到一个任务中?

<小时/>

Detailed Version

我们正在尝试制作可重用的 yml 模板(主要是 ps1 脚本步骤)。当我们将值传递给该模板时,我们不能将参数用于任何运行时值。因此,我们决定在这些任务中使用带有宏语法的变量

但问题是我们无法确保在模板内的工作单元实际运行之前传递因变量。

为了解决这个问题,我们决定创建一个带有步骤的验证模板,该模板可以在调用任何进一步的步骤之前运行。

//template file:validate-dependent-variables.yml
parameters:
- name: dependsOnVariables
type: object
default: {}

steps:
- ${{ each dependsOnVariable in parameters.dependsOnVariables }}:
- task: PowerShell@2
displayName: validate dependent variable ${{ dependsOnVariable }}
inputs:
pwsh: true
targetType: "inline"
script: |
#variable is present if its value is not equal to its literal replacement
$variable = "`$`(${{ dependsOnVariable }})"
$variableValue = '$(${{ dependsOnVariable }})'
$variableValueIspresent = $variable -ne $variableValue
Write-Host variableValueIspresent=$variableValueIspresent
if(!$variableValueIspresent)
{
Write-Error "variable $variable is not passed in"
Exit
}

以及用法

//do-something-task.yml
jobs:
- job: DoSomethingJob
pool:
vmImage: $(vmImage)
steps:
- template: 'validate-dependent-variables.yml'
parameters:
dependsOnVariables:
- appServiceResourceGroupName
- appServiceName
- packageVersion

- task: PowerShell@2
displayName: Run something useful
inputs:
pwsh: true
targetType: "inline"
script: |
Write-Host "$(appServiceResourceGroupName)"
Write-Host "$(appServiceName)"
Write-Host "$(packageVersion)"

逻辑是比较变量的字面用法,例如$(packageVersion),为其替换的运行时值,例如“1.2.3”

"$(packageVersion)" = "$(packageVersion)" ##validation failed
"$(packageVersion)" = "1.2.3" ##validation successful

当管道运行时,任务中的脚本(为每个参数生成)在执行之前如下所示

$variable = "`$`(packageVersion)"
$variableValue = '$(packageVersion)'
$variableValueIspresent = $variable -ne $variableValue
Write-Host variableValueIspresent=$variableValueIspresent
if(!$variableValueIspresent)
{
Write-Error "variable $variable is not passed in"
Exit
}

问题是这会为每个变量创建一个任务。 enter image description here

现在,验证模板在运行时创建任务列表。我们不能在脚本 block 中包含 each,因此 each 位于步骤级别

steps:
- ${{ each dependsOnVariable in parameters.dependsOnVariables }}:

问题:有没有办法调整模板逻辑,将所有检查合并到一个任务中?

<小时/>

最佳答案

您可以使用 convertToJson 函数将 YAML 对象 转换为 JSON,然后可以在 PowerShell 脚本中对其进行解析并按照您的意愿使用。

关于Azure Devops yaml管道,如何将foreach中的一系列步骤合并为一个步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77201229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com