将 dependentOn 设置为上一阶段,无需对 Azure Pipelines 中的值进行硬编码

问题描述 投票:0回答:2

使用 Azure Pipelines,如何将

dependsOn
设置为前一阶段而不对值进行硬编码?

我可以使用某种预定义变量吗?我只看到了当前阶段,没有看到之前的阶段。

我的管道正在执行 Terraform 部署。第一个(构建)阶段为每个环境并行运行

terraform plan
,然后由按顺序使用每个环境中的计划文件运行
terraform apply
的(部署)阶段使用。

我在计划(构建)和应用(部署)阶段使用两种不同的模板。我目前正在使用参数来指定

dependsOn
列表值,我需要在其中明确指定所有计划(构建)阶段,但是对于应用(部署)阶段,我希望将参数的默认值设置为类似 $ (Build.PreviousStage) 使其更加优雅。

# azure-pipelines.yml

# LINES REMOVED #

stages:
  # Terraform Plan (DevTest)
  - template: templates/plan.yml
    parameters:
      az_service_connection: DevTest-Terraform
      environment: DevTest

  # Terraform Plan (Stage)
  - template: templates/plan.yml
    parameters:
      az_service_connection: Stage-Terraform
      environment: Stage

  # Terraform Plan (Prod)
  - template: templates/plan.yml
    parameters:
      az_service_connection: Prod-Terraform
      environment: Prod

  # Terraform Deploy (DevTest)
  - template: templates/deploy.yml
    parameters:
      az_service_connection: DevTest-Terraform
      depends_on:
        - DevTest_Plan
        - Stage_Plan
        - Prod_Plan
      environment: DevTest

  # Terraform Deploy (Stage)
  - template: templates/deploy.yml
    parameters:
      az_service_connection: Stage-Terraform
      depends_on:
        - DevTest_Deploy
      environment: Stage

  # Terraform Deploy (Prod)
  - template: templates/deploy.yml
    parameters:
      az_service_connection: Prod-Terraform
      depends_on:
        - Stage_Deploy
      environment: Prod
# ./templates/deploy.yml

parameters:
  - name: az_service_connection
    type: string
  - name: depends_on
    type: object
  - name: environment
    type: string

stages:
  # Terraform Deploy
  - stage: ${{ parameters.environment }}_Deploy
    displayName: Terraform Deploy (${{ parameters.environment }})
    condition: and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI', 'Manual'))
    dependsOn:
      ${{ parameters.depends_on }}

# LINES REMOVED #
azure azure-devops azure-pipelines
2个回答
3
投票

检查

depends_on
参数是否为空的 if 条件,同时还将参数默认设置为“”允许我解决此问题,允许我为第一个 DEV 部署阶段设置
depends_on
参数,而不是为第二个 DEV 部署阶段设置它。其他。

正如 @Krzysztof Madej 在他的回答/评论中所述,不存在这样的变量来设置

dependsOn
的前一阶段,但如果未设置,将自动依赖于前一阶段。

# azure-pipelines.yml

# LINES REMOVED #

stages:
  # Terraform Plan (DevTest)
  - template: templates/plan.yml
    parameters:
      az_service_connection: DevTest-Terraform
      environment: DevTest

  # Terraform Plan (Stage)
  - template: templates/plan.yml
    parameters:
      az_service_connection: Stage-Terraform
      environment: Stage

  # Terraform Plan (Prod)
  - template: templates/plan.yml
    parameters:
      az_service_connection: Prod-Terraform
      environment: Prod

  # Terraform Deploy (DevTest)
  - template: templates/deploy.yml
    parameters:
      az_service_connection: DevTest-Terraform
      depends_on:
        - DevTest_Plan
        - Stage_Plan
        - Prod_Plan
      environment: DevTest

  # Terraform Deploy (Stage)
  - template: templates/deploy.yml
    parameters:
      az_service_connection: Stage-Terraform
      environment: Stage

  # Terraform Deploy (Prod)
  - template: templates/deploy.yml
    parameters:
      az_service_connection: Prod-Terraform
      environment: Prod

# templates/deploy.yml

parameters:
  - name: az_service_connection
    type: string
  - name: depends_on
    type: object
    default:
  - name: environment
    type: string

stages:
  # Terraform Deploy
  - stage: ${{ parameters.environment }}_Deploy
    displayName: Terraform Deploy (${{ parameters.environment }})
    condition: and(succeeded(), in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI', 'Manual'))
    ${{ if ne(length(parameters.depends_on), 0) }}:
      dependsOn:
        ${{ parameters.depends_on }}


1
投票

没有像你提到的那样的变量,但是

当您在管道中定义多个阶段时,默认情况下,它们按照您在 YAML 文件中定义的顺序依次运行。管道必须至少包含一个没有依赖关系的阶段。

# if you do not use a dependsOn keyword, stages run in the order they are defined
stages:
- stage: QA
  jobs:
  - job:
    ...

- stage: Prod
  jobs:
  - job:
    ...

正如here所写。所以如果你没有定义dependsOn阶段应该隐式依赖于前一个阶段。

© www.soinside.com 2019 - 2024. All rights reserved.