有没有办法在 Powershell 中创建一个数组并在 Azure DevOps YAML 中循环遍历它?

Posted

技术标签:

【中文标题】有没有办法在 Powershell 中创建一个数组并在 Azure DevOps YAML 中循环遍历它?【英文标题】:Is there a way to create an array in powershell and loop through it in Azure DevOps YAML? 【发布时间】:2020-12-16 18:02:18 【问题描述】:

我正在尝试针对 10 个实例上的 140 多个数据库为我们的数据库部署创建一个管道。我们的 IT 团队提到,在某些情况下,为了负载平衡,数据库将从一个实例移动到另一个实例。所以我不能相信每个版本的数据库都会保留在同一个实例上。我们还可以在我们的团队没有听到任何消息的情况下加入新客户。这意味着我必须编写一个可以动态部署到给定实例上的数据库的管道。每个实例都有一个单独的代理。

我现在计划的工作流程。

    从我们的主分支构建 DacPac。 添加与需要我们团队中的一个人批准发布的环境相关联的阶段。 运行 powershell 脚本以获取实例上的所有数据库并以列表形式返回。 遍历给定的列表并为每个数据库创建一个任务。

现在我在将数据库列表作为变量从 powershell 传递回 YAML 管道的部分遇到问题。理想情况下,我可以返回一个列表,然后使用 YAML 循环功能创建具有给定数据库名称的 SQL Server 部署任务。是否可以从 Powershell 返回一个列表并使用循环功能循环它们?下面是我使用的 YAML 示例减去我不想在那里共享的内容。


/*Pipeline Being Called*/
variables:
- name: BuildConfiguration
  value: release
- name: BuildPlatform
  value: any cpu
- name: system.debug
  value: true
- name: datamode 
  value: 0 
- name: APIMode
  value: 0
- name: Instance 
  value: "[ServerInstance]"
- name: var01
trigger: 
 - FixingDRDeployments

stages: 
- stage: Powershell 
  pool: [Agent Pool Name]
  jobs:
  - job: Powershell
    steps:
       - task: PowerShell@2
         inputs:
           targetType: 'inline'
           script: |
             $ServerInstance = "$(Instance)"
             
             
             $Databases = Get-DbaDatabase -SqlInstance $ServerInstance 
             $ReturnValues = @()
             
             $query = "
                Query to validate database is one we want to deploy against. 
             "
             
             
             foreach ( $db in $Databases) 
               $Results = Invoke-DbaQuery -SqlInstance $serverInstance -Database $db.name -Query $query
               if ($Results.Valid -eq 1) 
                 $ReturnValues += $db.Name
               
             
             Write-Host $ReturnValues
             



#stages:
- template: deploytemplates/BuildTemplate.yml
- template: template.yml
  parameters:
    param: ["TestDatabase1","TestDatabase2"]
**^ Instead of having a defined set of static databases, I'd like to be able to pass an array of databases from the powershell script above.**

/*deploytemplates/BUildTemplate.yml*/

stages:
- stage: Build 
  jobs:
    - job: build 
      pool:
       name: mn-vs2017
       demands:
        - msbuild
        - visualstudio
      steps:
       - task: VSBuild@1
         displayName: 'Build solution **\*.sln'
         inputs:
           solution: '**\*.sln'
           vsVersion: "15.0"
           msbuildArgs: '/p:OutDir=$(build.artifactstagingdirectory) /p:CmdLineInMemoryStorage=True'
           platform: '$(BuildPlatform)'
           configuration: '$(BuildConfiguration)'
           clean: true
           maximumCpuCount: true
           msbuildArchitecture: x64
       - task: PublishBuildArtifacts@1
         displayName: 'Publish Artifact: MasterDacPac'
         inputs:
          PathtoPublish: '$(build.artifactstagingdirectory)'
          ArtifactName: DacPac

/*template.yml*/
parameters: 
  param : []


stages:
- stage: ApprovalGate1
  displayName:  ApprovalGate1
  dependsOn: Build
  jobs: 
  - deployment: 
    displayName: ApprovalGate1
    pool: [Pool Name Here]
    environment: Databases
    strategy:
      runOnce:
        deploy: 
         steps:
          - task: DownloadSecureFile@1
            name: PublishProfile
            displayName: 'Download secure file'
            inputs:
              secureFile: Production.publish.xml
          - $ each p in parameters.param :
             - task: SqlDacpacDeploymentOnMachineGroup@0
               displayName: $ p 
               inputs:
                 DacpacFile: '$(Pipeline.Workspace)\DacPac\DacPacName.dacpac'
                 ServerName: $(Instance)
                 DatabaseName: $ p 
                 PublishProfile: '$(PublishProfile.secureFilePath)'
               continueOnError: true
               condition: succeededOrFailed()

【问题讨论】:

【参考方案1】:

不,这是不可能的。如果您在 powershell 中创建变量,您将创建字符串类型的变量。 It is even worse:

Yaml 变量一直是字符串:字符串映射。

我们准备在不久的将来发布一项功能,让您可以通过更复杂的结构。敬请期待!

你可以使用数组作为参数,但这只是静态的,你已经知道了:

steps:
- template: template.yaml
  parameters:
    instances: 
    - test1
    - test2
    server: someServer

【讨论】:

以上是关于有没有办法在 Powershell 中创建一个数组并在 Azure DevOps YAML 中循环遍历它?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 C++ 中创建一个循环数组

VSTS API:在当前迭代中创建bug

如何在 numpy 中创建布尔数组

在 PowerShell 中将没有展平列表的 JSON 数组写入文件

使用 PowerShell 在远程服务器中创建文件夹 [重复]

是否可以使用 powershell 在存储帐户中创建 blob?