【问题标题】:Azure Pipeline LoopsAzure 管道循环
【发布时间】:2021-09-09 06:49:36
【问题描述】:

我现在在这方面花了很多时间,但似乎无法做到这一点,所以需要寻求建议。

我有一个 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 工件添加到构建中,然后引用它会工作,但似乎我无法在尚未执行下载阶段的步骤中直接引用模板。

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

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

更新

我已经解决了这个问题,我基本上使用 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\"]"

【问题讨论】:

标签: azure loops yaml azure-pipelines devops


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多