在多阶段yaml管道中将矩阵定义为变量

时间:2019-12-04 08:38:26

标签: azure-devops yaml azure-pipelines

我正在创建一个多阶段的Azure DevOps(yaml)管道,该管道使用对其他模板的多个引用。如您在下面的管道中看到的,我必须为我的build-client-steps.ymldistribute-client-steps.yml文件提供相同的矩阵。该矩阵用于我的管道策略。

有没有办法将此矩阵声明为我的azure-pipelines.yml文件的变量?

stages:
- stage: build
  displayName: Build & validate
  jobs:
    - template: pipelines/templates/build-client-steps.yml
      parameters:
        matrix:
          base-ios-prod:
            app: string
            artifact: string
            variant: string
            os: ios
            distribution: string
          base-android-prod:
            app: string
            artifact: string
            variant: string
            os: android
            distribution: string
        keystore_password: '$(keystore_password)'
        keystore_alias: '$(keystore_alias)'
        APPLE_CERTIFICATE_SIGNING_IDENTITY: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
        APPLE_PROV_PROFILE_UUID: '$(APPLE_PROV_PROFILE_UUID)'
        teamId: '$(teamId)'
        P12Password: '$(P12Password)'         
    - template: pipelines/templates/build-server-steps.yml
    - template: pipelines/templates/build-infra-steps.yml
    - template: pipelines/templates/build-sap-steps.yml
- stage: prepareBase
  displayName: Prepare base infra
  dependsOn: build
  jobs:
    - template: pipelines/templates/deploy-infra-jobs.yml
      parameters:
        parameterFile: string
        resourceGroup: string
- stage: deployBase
  displayName: Deploy base
  dependsOn: prepareBase
  jobs:
    - template: pipelines/templates/deploy-server-jobs.yml
      parameters:
        resourceGroup: string
- stage: activateBase
  displayName: Activate base
  dependsOn: deployBase
  jobs:
    - template: pipelines/templates/swap-app-jobs.yml
      parameters:
        parameterFile: string
        resourceGroup: string
    - template: pipelines/templates/distribute-client-jobs.yml
      parameters:
        matrix:
          base-ios-prod:
            app: string
            artifact: string
            variant: string
            os: ios
            distribution: string
          base-android-prod:
            app: string
            artifact: string
            variant: string
            os: android
            distribution: string

2 个答案:

答案 0 :(得分:0)

  

有没有办法将此矩阵声明为我的变量   azure-pipelines.yml文件?

就这个问题而言,据我所知,这在yaml管道中是不可行的。document中有一条声明:由于变量是在工作开始时扩展的,因此您不能在策略。因此,即使您可以将矩阵定义为变量,也无法在策略中引用它。

此外,您的build-client-steps.ymldistribute-client-steps.yml文件应该是作业模板,然后您应该能够将矩阵写入作业模板。这样,您只需要引用azure-pipelines.yml文件中的作业模板即可。

答案 1 :(得分:0)

在纯 YAML 中似乎不可能做到这一点,但 documentation 表示可以从 JSON 序列化字符串解释矩阵策略配置。

提供的示例演示了如何使用 step 输出包含潜在动态 JSON 编码对象的变量,然后在后续步骤中使用该变量。我发现也可以以相同的方式使用包含 JSON 编码矩阵的静态变量。带有 > 的 YAML 多行文本格式功能使得定义这样的 JSON 字符串相当方便。例如:

variables:
  targets: >
    {
      base-ios-prod:
      {
        app: 'string',
        artifact: 'string',
        variant: 'string',
        os: 'ios',
        distribution: 'string'
      },
      base-android-prod:
      {
        app: 'string',
        artifact: 'string',
        variant: 'string',
        os: 'android',
        distribution: 'string'
      }
    }

stages:
- stage: build
  displayName: Build
  jobs:
    - job: buildSrc
      displayName: Build source
      strategy:
        matrix: $[ variables.targets ]
      ...

- stage: deploy
  displayName: Deploy
  jobs:
    - job: deployApp
      displayName: Deploy application
      strategy:
        matrix: $[ variables.targets ]
      ...