【问题标题】:Looping through variables in Azure pipeline循环遍历 Azure 管道中的变量
【发布时间】:2020-12-02 19:44:57
【问题描述】:

我有一个文本文件,其中有两个名称 client1client2

我有一个用于读取文本文件的 Powershell 脚本,我的理解是它已经创建了一个数组。

$clientvariable = Get-Content -Path {FilePath}/{File};
Write-Host "vso[task.setvariable variable=clientname]$clientvariable

所以现在 clientname 的值 $clientvariable 设置为 client1 client2,如果需要,我可以索引每个位置。

如何在 Azure 管道 YAML 中使用它,以便可以单独查看每个名称并在下一个之后循环遍历?

目标是获取每个名称并使用文件中的名称与 ARM 模板(即client1SQLserverclient2SQLserver)一起创建一个资源

我已经看到您可以使用带有参数的模板来创建 for 循环,那么在这种情况下是否可以使用,或者是否有其他方法可以做我正在寻找的事情?

【问题讨论】:

    标签: azure powershell azure-devops devops


    【解决方案1】:

    如何在 Azure 管道 YAML 中使用它,以便可以单独查看每个名称并在下一个之后循环遍历?

    我们可以指定一个作业基于在前一个作业中设置的输出变量的值运行,以单独循环每个名称。

    由于我没有文本文件名,因此我在示例中使用自定义字符数组而不是文件名,例如 $FileNames = '"test1","test2","test3","test4"':

    我的 Azure 管道 yaml 文件:

    trigger:
        branches:
          include:
            - master
    
    
        stages:
          - stage: LoopFileName
            jobs:
            - job: A
              pool:
                name: MyPrivateAgent
              steps:
              - task: PowerShell@2
                condition: succeeded()
                displayName: "Create a list"
                inputs:
                  targetType: 'inline'
                  script: |
                      $FileNames = '"test1","test2","test3","test4"'
                          Write-Host "##vso[task.setvariable variable=LoopFileName;isOutput=true]$FileNames"                
                name: fileoutput
        
            - job: B
              dependsOn: A
              pool:
                name: MyPrivateAgent
              variables: 
                AllFileNames: $[dependencies.A.outputs['fileoutput.LoopFileName']]
              steps:
              - template: loopTemplate.yml
                parameters: 
                  files : $(AllFileNames)
    

    然后是loopTemplate.yml 文件:

    parameters:
      files: []
    
    steps :
    - task: PowerShell@2
      displayName: 'Fetching ValueFiles'
      inputs:
        targetType: 'inline'
        script: >
    
          foreach ($i in ${{parameters.files}})
          {
            Write-Host "filenames=$i"
          }
    

    测试结果:

    在这种情况下,我们可以创建一个具有名称的资源。

    您可以查看文档Conditions 了解更多详细信息。

    【讨论】:

    • 感谢 Leo 的帮助,我会在明天或周六进行调查并回复您。目前在我的 ARM 部署中,我使用 overrideParameters 字段,因为我能够让我的变量只等于一个名称。是否仍然可以传入这个新变量并让 ARM 模板仍然有效?如果我理解你的代码,我想我需要做一些事情,比如-parameter $(i)
    • 还想问一下,在您的管道 YAML 中,您是否需要像您一样定义 $FileNames 或者您可以让您的脚本读取文档并创建该列表?我如何提取名称的代码在 OP 中,我只是不确定我的脚本提取名称的方式是否与 $FileNames 的命名约定格式相似。
    • @ubiquitinoob44,我认为我们可以创建脚本读取文档并使用 powershell 脚本创建该列表。但是由于我不是powershell方面的专家,所以不能直接给出这样的样例,个人认为是可行的。我会尝试找到一个关于它的示例,并在以后与您分享。
    • @ubiquitinoob44,找到了!检查问题中 azure-pipeline.yaml 文件中的 PowerShell 任务:stackoverflow.com/questions/59425275/…Write-Host "Fetching value files" cd myfolder $a=git ls-files $List = $a | foreach {'**/myfolder/dev/' + $_} Write-Host $List $d = '"{0}"' -f ($List -join '","') ...
    • @ubiquitinoob44,这个问题有什么更新吗?你解决了这个问题吗?如果没有,请告诉我有关此问题的最新信息吗?
    猜你喜欢
    • 2021-04-14
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2019-01-07
    • 2014-11-28
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多