提供数组作为 devops 管道的参数

Dav*_*e F 7 azure devops azure-pipelines

我刚刚开始使用天蓝色管道。我们希望不再使用arm模板和参数文件手动部署Azure资源,而是使用devops管道来完成此任务。

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

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

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

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

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

但所有这些产生的只是一个字符串,我无法将其拆分。

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

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

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

谢谢戴夫

Vit*_*Liu 6

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

创建 yaml 构建并添加任务电源 shell。我们还可以使用扩展Replace Tokens来更新文件的值

$ourfiles = Get-Content "file path"
Write-Output $ourfiles

$CharArray =$ourfiles.Split(" ")
$CharArray
Run Code Online (Sandbox Code Playgroud)

2.我们也可以在yaml中使用each,请参阅此文档以获取更多详细信息。

模板文件: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!
Run Code Online (Sandbox Code Playgroud)

YAML 构建

extends:
  template: test.yml
  parameters:
    InstanceArgs:  
      In1 : _1
      In2 : _2
Run Code Online (Sandbox Code Playgroud)

我希望它能帮助你。

  • 感谢您的建议。按照以下注释:[https://learn.microsoft.com/en-us/azure/devops/pipelines/release/variables?view=azure-devops&tabs=batch#using-custom-variables] 建议类似“Write-” Host "##vso[task.setvariable variable=fileList]$fileList"` 但这只是发回一个空格分隔的字符串,而不是一个数组。尝试使用带有 -separator 修饰符的 write-host 也不起作用。你的第二个例子很棒 - 但我仍然坚持我最初的问题,除了硬编码之外,如何将参数数组放入参数列表中。 (4认同)