将dependensOn设置为上一阶段,而不在Azure管道中对值进行硬编码



使用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 #

一个if条件,用于检查depends_on参数是否为空,同时还将参数默认设置为"quot;允许我解决这个问题,允许我为第一个DEV部署阶段设置depends_on参数,而不为其他阶段设置。

正如@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:
...

正如这里所写的。所以,如果您不定义dependensOn阶段应该隐式地依赖于前一阶段。

最新更新