首页 > 解决方案 > 如何在 Azure DevOps 中使用具有阶段依赖性的 DependsOn

问题描述

我有以下模板进行多阶段部署:

parameters:
- name: Stage
  type: string
- name: Environment
  type: string
- name: Enabled  
  type: boolean
  default: false
- name: WebAppName
  type: string
- name: ArtifactName
  type: string

stages:

- stage: ${{ parameters.Stage }}  
  displayName: '${{ parameters.Stage }} Stage'
  dependsOn: '${{ parameters.DependsOn }}'
  jobs:
   - deployment: ${{ parameters.Environment }} 
     timeoutInMinutes: 70
     environment: '${{ parameters.Environment }} Environment'
     pool:
        vmImage: $(vmImageName)
     strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadBuildArtifacts@0
            inputs:
              buildType: 'current'
              downloadType: 'single'
              artifactName: ${{ parameters.ArtifactName }}
              downloadPath: '$(System.ArtifactsDirectory)'
          - task: AzureRmWebAppDeployment@4
            inputs:
              ConnectionType: 'AzureRM'
              azureSubscription: 'AzureConnectionSC'
              appType: 'webApp'
              WebAppName: ${{ parameters.WebAppName }}
              package: '$(System.ArtifactsDirectory)/**/*.zip'

从我的管道中,我正在使用模板:

- template: azure-pipelines-multi-stage-release.yml  # Template reference
    parameters:
       Environment: 'Dev'
       Enabled: True
       WebAppName: 'azureappservicehelloworldapp-dev'
       Stage: 'Dev'
       ArtifactName : 'helloWorldArtifact'

  - template: azure-pipelines-multi-stage-release.yml  # Template reference
    parameters:
       Environment: 'UAT'
       Enabled: True
       WebAppName: 'azureappservicehelloworld-uat'
       Stage: 'UAT'
       ArtifactName : 'helloWorldArtifact'

  - template: azure-pipelines-multi-stage-release.yml  # Template reference
    parameters:
       Environment: 'Prod'
       Enabled: True
       WebAppName: 'azureappservicehelloworld'
       Stage: 'Prod'
       ArtifactName : 'helloWorldArtifact'

如何将 DependsOn 传递到模板中,在 dev 中没有阶段依赖,因此它应该直接部署,但 UAT 依赖于 Dev,Prod 依赖于 UAT。我如何将值传递给模板,如果没有传递任何内容,它应该继续部署,如果某些内容作为依赖项传递,它应该在安装之前验证该阶段。

标签: azure-devopsazure-pipelinesazure-pipelines-yaml

解决方案


您在模板中声明一个DependsOn对象参数。这将是必需的,但在模板中进行了检查。如果您不想要依赖项,只需传递一个空的 DependsOn。这被设置为一个对象,以便您可以传递阶段列表,以防您有一个依赖于多个阶段的阶段。

像这样设置你的管道:

stages:
- template: azure-pipelines-multi-stage-release.yml  # Template reference
  parameters:
      Environment: 'Dev'
      Enabled: True
      WebAppName: 'azureappservicehelloworldapp-dev'
      Stage: Dev
      ArtifactName : 'helloWorldArtifact'
      # empty DependsOn, as Dev depends on nothing
      DependsOn:
- template: azure-pipelines-multi-stage-release.yml  # Template reference
  parameters:
      Environment: 'UAT'
      Enabled: True
      WebAppName: 'azureappservicehelloworld-uat'
      Stage: UAT
      ArtifactName : 'helloWorldArtifact'
      DependsOn:
      - Dev
- template: azure-pipelines-multi-stage-release.yml  # Template reference
  parameters:
      Environment: 'Prod'
      Enabled: True
      WebAppName: 'azureappservicehelloworld'
      Stage: Prod
      ArtifactName : 'helloWorldArtifact'
      DependsOn:
      - UAT

你的模板是这样的:

parameters:
- name: Stage
  type: string
- name: Environment
  type: string
- name: Enabled  
  type: boolean
  default: false
- name: WebAppName
  type: string
- name: ArtifactName
  type: string
- name: DependsOn
  type: object

stages:
- stage: ${{ parameters.Stage }}  
  displayName: '${{ parameters.Stage }} Stage'
  # only include the DependsOn parameter if provided
  ${{ if parameters.DependsOn }}:
    dependsOn: '${{ parameters.DependsOn }}'
  jobs:
   - deployment: ${{ parameters.Environment }} 
     timeoutInMinutes: 70
     environment: '${{ parameters.Environment }} Environment'
     pool:
        vmImage: $(vmImageName)
     strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadBuildArtifacts@0
            inputs:
              buildType: 'current'
              downloadType: 'single'
              artifactName: ${{ parameters.ArtifactName }}
              downloadPath: '$(System.ArtifactsDirectory)'
          - task: AzureRmWebAppDeployment@4
            inputs:
              ConnectionType: 'AzureRM'
              azureSubscription: 'AzureConnectionSC'
              appType: 'webApp'
              WebAppName: ${{ parameters.WebAppName }}
              package: '$(System.ArtifactsDirectory)/**/*.zip'

您的管道将扩展到:

stages:
- stage: Dev
  displayName: Dev Stage
  jobs:
  - deployment: Dev
    timeoutInMinutes: 70
    environment:
      name: Dev Environment
    pool:
      vmImage: $(vmImageName)
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadBuildArtifacts@0
            inputs:
              buildType: 'current'
              downloadType: 'single'
              artifactName: helloWorldArtifact
              downloadPath: '$(System.ArtifactsDirectory)'
          - task: AzureRmWebAppDeployment@4
            inputs:
              ConnectionType: 'AzureRM'
              azureSubscription: 'AzureConnectionSC'
              appType: 'webApp'
              WebAppName: azureappservicehelloworldapp-dev
              package: '$(System.ArtifactsDirectory)/**/*.zip'
- stage: UAT
  displayName: UAT Stage
  dependsOn:
  - Dev
  jobs:
  - deployment: UAT
    timeoutInMinutes: 70
    environment:
      name: UAT Environment
    pool:
      vmImage: $(vmImageName)
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadBuildArtifacts@0
            inputs:
              buildType: 'current'
              downloadType: 'single'
              artifactName: helloWorldArtifact
              downloadPath: '$(System.ArtifactsDirectory)'
          - task: AzureRmWebAppDeployment@4
            inputs:
              ConnectionType: 'AzureRM'
              azureSubscription: 'AzureConnectionSC'
              appType: 'webApp'
              WebAppName: azureappservicehelloworld-uat
              package: '$(System.ArtifactsDirectory)/**/*.zip'
- stage: Prod
  displayName: Prod Stage
  dependsOn:
  - UAT
  jobs:
  - deployment: Prod
    timeoutInMinutes: 70
    environment:
      name: Prod Environment
    pool:
      vmImage: $(vmImageName)
    strategy:
      runOnce:
        deploy:
          steps:
          - task: DownloadBuildArtifacts@0
            inputs:
              buildType: 'current'
              downloadType: 'single'
              artifactName: helloWorldArtifact
              downloadPath: '$(System.ArtifactsDirectory)'
          - task: AzureRmWebAppDeployment@4
            inputs:
              ConnectionType: 'AzureRM'
              azureSubscription: 'AzureConnectionSC'
              appType: 'webApp'
              WebAppName: azureappservicehelloworld
              package: '$(System.ArtifactsDirectory)/**/*.zip'


推荐阅读