【问题标题】:Providing arrays as parameters to devops pipelines将数组作为参数提供给 devops 管道
【发布时间】:2020-07-16 12:28:03
【问题描述】:

我刚刚开始使用 azure 管道。我们希望不再使用 arm 模板和参数文件手动部署 Azure 资源,而是使用 devops 管道进行部署。

虽然使用单个模板+参数的 json 文件执行此操作很简单,但我看不到处理多个文件的明智方法。

我已经看到有关使用数组作为管道模板参数的讨论 - 这会起作用,但除了在管道 yaml 文件中手动设置之外,我看不到如何创建参数数组。

更有用的解决方案是从文本文件中读取其内容——我们可以在读取文件之前生成它,或者——甚至更理想地——通过引用包含 json 的 repo 中的文件夹的目录列表他们都通用的模板的参数文件。

yaml 管道中的代码片段能够传回单个字符串变量,例如

script: |
      # Get list of files in folder
      $fl =  get-childitem ./templates | select-object -expand name
      Write-output  "##vso[task.setvariable variable=fl]$fl"
      

但所有这一切都产生了一个我无法拆分的单个字符串。

同样,我可以使用一段代码来动态创建文件列表 - 但同样,看不到如何在管道中读取它。

有没有一种方法可以让我在 devops 管道中动态设置参数数组的内容,或者从文件中读取数组?

或者我应该放弃并在 powershell 脚本中编写整个内容并使用任务来运行它,而不是尝试在 devops 中使用 azure 部署任务?

谢谢 戴夫

【问题讨论】:

    标签: azure azure-pipelines devops


    【解决方案1】:

    1.读取String文件,将字符串拆分成yaml上的数组

    创建一个 yaml 构建并添加任务 power shell。我们也可以使用扩展名Replace Tokens 来更新文件的值

    $ourfiles = Get-Content "file path"
    Write-Output $ourfiles
    
    $CharArray =$ourfiles.Split(" ")
    $CharArray
    

    2.我们也可以在yaml中使用每个,详情请参考doc

    模板文件:test.yml

    parameters:
    - name: InstanceArgs 
      type: object
      default: [] 
    stages:
      - stage: deploy
        displayName: deploy
        jobs:
          - ${{ each arg in parameters.InstanceArgs }}:
            - deployment: ${{ arg.value }}
              displayName: ${{ arg.value }}
              environment: Development
              strategy:
                runOnce:
                  deploy:
                    steps:
                    - script: echo Hello, world!
    

    YAML 构建

    extends:
      template: test.yml
      parameters:
        InstanceArgs:  
          In1 : _1
          In2 : _2
    

    希望对你有帮助。

    【讨论】:

    • 感谢您的建议。按照以下说明:[docs.microsoft.com/en-us/azure/devops/pipelines/release/… 建议类似Write-Host "##vso[task.setvariable variable=fileList]$fileList" 但这只是发回一个空格分隔的字符串,而不是一个数组。尝试使用带有 -separator 修饰符的 write-host 也不起作用。你的第二个例子很棒 - 但我仍然坚持我原来的问题,即除了硬编码之外,如何将参数数组放入参数列表中。
    • 作为一种解决方法,我们可以将变量存储在josn文件中,通过power shell命令读取文件,然后调用API设置这些变量
    • 谢谢 - 但我认为根本问题是字符串变量没有用 - 我需要一个数组,而这在管道中不是一个东西。数组可以作为参数存在 - 所以如果我可以从文件中读取参数,那会很好用。但我也看不出该怎么做。感谢您的评论。
    • 你有没有用这个@DaveF得到任何地方?
    • 哈哈同样的问题。有什么进展吗?
    【解决方案2】:

    您可以使用extends 创建用于部署资源的管道模板。这可以为您要部署的资源设置一个参数,包括 arm 模板 + 参数文件数组,然后使用 foreach 循环遍历它们。然后,您可以将您的资源硬编码到多个管道的参数中,触发器按分支/路径/您的其他条件过滤,这些条件将这些参数传递到模板中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-25
      • 2020-12-16
      • 2011-07-04
      • 2019-02-16
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多