【问题标题】:Fill runtime azure pipeline parameters from external source从外部源填充运行时天蓝色管道参数
【发布时间】:2020-08-27 08:31:12
【问题描述】:

我们希望创建一个管道来更新我们的多租户 Azure 环境。我们需要在每个租户的更新期间执行一些操作。为此,我们希望为每个租户创建一个作业,以便我们可以并行处理租户。为此,我想使用运行时参数将要更新的租户传递到我的管道,如下所示:

parameters:
- name: tenants
  type: object

tenants 参数的值可能如下所示:

- Name: "customer1"
  Someotherproperty: "some value"
- Name: "customer2"
  Someotherproperty: "some other value"

要生成作业,我们执行以下操作:

stages:
- stage:
  jobs:
  - job: Update_Tenant
    strategy:
      matrix:
        ${{ each tenant in parameters.Tenants }}:
          ${{ tenant.tenantName }}:
            name: ${{ tenant.tenantName }}
            someproperty: ${{ tenant.otherProperty }}
      maxParallel: 2
    steps:
      - checkout: none
      - script: echo $(name).$(someproperty) 

现在我们需要的是某种方式来填充这个tenants 参数。现在我尝试了一些解决方案:

  • 理想情况下,我想在Update_Tenants 阶段之前放置一个构建阶段以调用REST api 来获取租户,并在Update_Tenants 阶段启动时扩展tenants 参数,但这不支持AFAIK,因为参数扩展是在管道启动时完成的。

  • 一个不太理想但仍然可行的选项是创建一个包含租户的变量组 yaml 文件,并将此变量组包含在我的管道中,并使用 ${{ variables.Tenants }} 语法来引用它们。但是,由于某种原因,变量只能是字符串。

我目前能想到的唯一解决方案是创建一个调用 REST api 来让租户更新的管道,然后使用 azure devops api 以正确的参数值对实际更新过程进行排队。但这感觉有点笨拙。

现在我的问题是,有没有(更好的?)替代方案来完成我想做的事情?

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

    为此,我们希望为每个租户创建一个工作,因此我们 可以并行处理租户。

    除了滚动部署策略,还可以查看Strategies and Matrix

    除非你必须使用运行时参数,否则你可以尝试这样的事情:

    jobs:
    - job: Update
      strategy:
        matrix:
          tenant1:
            Someotherproperty1: '1.1'
            Someotherproperty2: '1.2'
          tenant2:
            Someotherproperty1: '2.1'
            Someotherproperty2: '2.2'
          tenant3:
            Someotherproperty1: '3.1'
            Someotherproperty2: '3.2'
        maxParallel: 3
      steps:
          - checkout: none
          - script: echo $(Someotherproperty1).$(Someotherproperty2) 
            displayName: 'Echo something'
    

    【讨论】:

    • 问题是,我不想硬编码管道中的租户,但使用这些策略的唯一方法是使用运行时参数,因为它是影响工作的唯一方法扩张。矩阵结合运行时参数可能已经使我的解决方案更好一点,但仍然需要我首先启动一个不同的管道才能使用正确的参数调用我的管道
    • 我已经测试过了,确实使用矩阵使它更好一些,因为现在我可以控制正在执行的最大并行作业。但是,我仍然需要一些方法来填充租户参数(原始问题)。据我所知,它必须是一个参数,否则我无法正确扩展矩阵
    • 这里是 one discussion 关于从对象到字符串的类型转换。看起来您不能以这种方式使用 someotherProperty。
    • 感谢您的调查,但我不明白这对我有什么帮助。我需要某种方法来指定管道本身内的运行时参数,而不是将对象转换为字符串。我认为我使用 Api 的解决方案是完成我想要的不幸的唯一方法
    【解决方案2】:

    也许这会有所帮助。我能够使用外部源(.txt 文件)来填充 azure 管道中的数组变量。

    工作示例

              # Create a variable
              - bash: |
                  arrVar=()
                  for images in `cat my_images.txt`;do
                    arrVar+=$images
                    arrVar+=","
                  done;
                  echo "##vso[task.setvariable variable=list_images]$arrVar"
    
              # Use the variable
              # "$(list_images)" is replaced by the contents of the `list_images` variable by Azure Pipelines
              # before handing the body of the script to the shell.
              - bash: |
                  echo my pipeline variable is $(list_images)
    

    来源(也有矩阵的例子)

    其他来源

    【讨论】:

    • 谢谢。问题是我需要为每个租户运行一项工作。似乎不可能基于变量创建矩阵,因此您的解决方案对我不起作用。我们坚持使用 API 使用单独的管道以正确的参数值对实际管道进行排队,直到找到更好的解决方案
    猜你喜欢
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 2021-11-01
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多