使用 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 #
检查
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 }}
没有像你提到的那样的变量,但是
当您在管道中定义多个阶段时,默认情况下,它们按照您在 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阶段应该隐式依赖于前一个阶段。