Azure 管道循环

标签 azure loops yaml azure-pipelines devops

我现在在这方面花了相当多的时间,但似乎无法做到正确,因此需要寻求建议。

我有一个 GitHub 存储库,其中包含一系列 ZIP 文件。对于我想要在 DevOps 中执行模板的每个 Zip 文件,可能有 1 个,也可能有 10 个。对于每个文件,我想要执行相同的检查。

我编写了一个 PowerShell 任务来扫描并收集 zip 文件列表。我花了相当多的时间尝试使用 OutPut 变量和变量,但似乎您根本无法使用 Azure Pipelines 中的变量来利用数组。

    steps:
  - ${{ each var in variables }}:
    - task: PowerShell@2
      displayName: 'Checking variables ${{ var.key }}'
      inputs:
        targetType: Inline
        script: |
          Write-Host ${{ var.name }}
          Write-Host ${{ var.key }}
          Write-Host ${{ var.value }}
          Write-Host "${{ convertToJson(var) }}"

我能够循环遍历管道中的所有现有变量,但任务变量似乎未添加到此列表中?

Write-Host "##vso[task.setvariable variable=filePath;isOutput=true]$YamlVar.FullName"

使用上面的task.setvariable我可以设置和访问一个变量,但它是一个字符串,显然要多次循环遍历模板并执行与${{each一起工作的相同步骤变量中的 var }}: 结构。

还设法编写了一个variables.yml并将其添加到一个工件中,但我似乎找不到一种方法来访问我的新工件以进行潜在的利用。

- job: B
dependsOn: A1
pool:
  vmImage: windows-latest
variables:
  - template: ./variables.yml
steps:
  - ${{ each var in variables }}:
    - task: PowerShell@2
      displayName: 'Checking variables ${{ var.key }}'
      inputs:
        targetType: Inline
        script: |
          Write-Host ${{ var.name }}
          Write-Host ${{ var.key }}
          Write-Host ${{ var.value }}
          Write-Host "${{ convertToJson(var) }}"

更新

这是迄今为止壁橱的答案,但在使用时似乎是这样的。

- ${{ each var in variables }}:

变量或参数未被处理。因此它被直接解释为 Micro $(allfiles),而不是扩展和利用。

https://stackoverflow.com/a/59451690/16318957

如果我可以知道如何将我的 .yml 工件添加到构建中,然后引用它可以工作,但看来我无法在尚未执行下载阶段的步骤中直接引用模板。

这将允许我创建一个包含硬编码参数和变量的模板文件,然后发布该文件并使用该工件来执行正确数量的步骤。

当尝试下载我的工件时,我没有收到任何文件。

Artifact Download

更新

我已经解决了这个问题,我基本上使用 DevOps API 将对象数组传递到模板中以调用单独的管道。我运行一个 PowerShell 脚本,传入所需的变量。

- task: PowerShell@2
          inputs:
            filePath: './PowerShell/deployment.ps1'
            arguments: '-variable "TEST" -step "TEST_DEPLOYMENT" -env "TEST" -pat "$(pat)"'

然后调整 JSON 变量并使用数组列表从 API 调用管道。您的 JSON 需要利用对象作为 JSON 文本。

$JSON = @'
{
    "variables":{
        "file1":{
            "isSecret":false,
            "value":"test11"
        },
        "file2":{
            "isSecret":false,
            "value":"test21"
        }
    },
    "templateParameters":{
        <zipfilefilenameshere>,
    }
}
'@

然后使用传递对象数组的 API 触发管道。

uripipeline = "https://dev.azure.com/$($org)/$($proj)/_apis/pipelines/$($id)/runs?api-version=6.0-preview.1"

发送对象时,其结构需要类似于 JSON 文本。

示例:

"[\"file1.zip\",\"file2.zip\"]"

最佳答案

我设法通过创建一个单独的管道,然后从原始管道调用该管道并传入我的对象数组来使其工作。

我正在使用此 API 调用来使其正常工作。

https://dev.azure.com/$($org)/$($proj)/_apis/pipelines/$($id)/runs?api-version=6.0-preview.1

我在原始问题末尾更新的一些示例。

关于Azure 管道循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68138386/

相关文章:

azure - Azure 共享应用服务计划中的不同环境

c - fgets 输出奇怪的垃圾字符

c++ - 如何在 C++ 中打印数组、暂停并继续打印数组?

aws-lambda - 无服务器框架 : CloudFormation Variable Import/Export

kubernetes - 使用多行 shell 脚本作为 helm 值

azure - Azure 服务结构无状态服务的扩展

Azure Bicep - 在预先存在的 Azure Key Vault 中创建 Key Vault key

templates - 有没有办法从字符串创建可迭代列表?

azure - 无法部署 Azure Function 应用设置,因为文件共享返回 403

PHP 在保留键的同时遍历多维数组