azure 在管道中动态创建特定作业的数量

rur96b6h  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(116)

我正在寻找动态运行Azure管道的架构解决方案。让我们假设我将有一个包含各种实体信息的数据库。每个实体都拥有执行特定软件所需的基本信息。实体的数量将随着时间的推移而增加。因此,我想创建一个管道,从数据库中读取数据(这是一个简单的步骤),然后根据该信息生成适当数量的作业。这是因为每个实体都需要在单个VM上运行。所有数据都是可重复的。
我最初的想法是创建一个新的YAML模板文件,然后在第一个管道中覆盖它以触发适当的操作。然而,这种方法似乎有些不雅,我担心它的有效性。
有人遇到过类似的情况吗?不幸的是,由于可以同时执行的管道数量有限,我正在寻求解决方案。

sigwle7e

sigwle7e1#

恐怕我们无法通过单一的管道来满足您的需求。
获取示例数量和设置Pipeline中的作业数量的步骤不能同时完成。
根据您的要求,我建议您可以使用两个管道来实现这一点。一个管道用于获取示例的数量,并通过Rest API将值传递给另一个管道:Runs - Run Pipeline,另一个使用对象类型parameters来循环所有示例并设置作业号。
请参考以下步骤:
对于要获取示例数量的管道,您可以获取所有示例名称并将其传递给另一个管道:
举例来说:

  1. $token = "PAT"
  2. $url="https://dev.azure.com/{orgname}/{projectname}/_apis/pipelines/{PipelineID}/runs?api-version=5.1-preview"
  3. $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
  4. $JSON = @'
  5. {
  6. "resources": {
  7. "repositories": {
  8. "self": {
  9. "refName": "refs/heads/master"
  10. }
  11. }
  12. },
  13. "templateParameters": {
  14. "instances":"[instance1,instance2,instance3]"
  15. },
  16. }
  17. '@
  18. $response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -Body $JSON -ContentType application/json

对于要设置作业的管道,您可以定义对象参数并循环所有值。
举例来说:

  1. pool:
  2. vmImage: ubuntu-20.04
  3. parameters:
  4. - name: instances
  5. type: object
  6. default: []
  7. jobs:
  8. - ${{ each instance in parameters.instances }}:
  9. - job:
  10. steps:
  11. - script: echo ${{ instance }}

测试结果:
当我们将3个示例传递给管道时,它将创建3个作业。

你也可以参考我的另一张票。

展开查看全部
nwsw7zdq

nwsw7zdq2#

可能矩阵作业才是正确的解决方法。
您只需要在数据收集任务中构建简单的JSON。

  1. {
  2. "entity1": {
  3. "Key1": "Value1",
  4. "Key2": "Value2"
  5. },
  6. "entity2": {
  7. "Key1": "Value3",
  8. "Key2": "Value4"
  9. }
  10. }

将其作为管道变量输出。
https://learn.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=yaml%2Cbatch#understand-variable-syntax
为下面的“Matrix”创建依赖项作为收集任务,并使用JSON中的变量作为脚本的参数。

  1. - job: collectionJob
  2. steps:
  3. - task: <Propertask>
  4. name: generator
  5. # PowerShell example for emitting the var:
  6. # $json = $collectedData | ConvertTo-Json -Compress
  7. # Write-Host -Object "##vso[task.setvariable variable=json;isOutput=true]$json"
  8. - job: doThings
  9. dependsOn: collectionJob
  10. condition: <check if the json is having content>
  11. # The json is a string so length() with combination of gt() works
  12. # gt(length(dependencies.collectionJob.outputs['generator.json']),12)
  13. strategy:
  14. maxParallel: <define how many>
  15. matrix: $[ dependencies.collectionJob.outputs['generator.json'] ]
  16. steps:
  17. # Using PowerShell as example
  18. - task: PowerShell@2
  19. name: scriptTask
  20. displayName: Task Name -
  21. inputs:
  22. pwsh: true
  23. ScriptType: filePath
  24. ScriptPath: <path>/script.ps1
  25. ScriptArguments: >-
  26. -Key1 $Key1
  27. -Key2 $Key2

基于示例JSON,您将获得两个具有名称的作业:

  • 任务名称-实体1
  • 任务名称-实体2

这两个作业将各自的变量传递给脚本。更多信息:https://learn.microsoft.com/en-us/azure/devops/pipelines/yaml-schema/jobs-job-strategy?view=azure-pipelines

展开查看全部

相关问题