如何使用在 Azure DevOps 中具有阶段依赖关系的 DependsOn

Vij*_*udi 0 azure-devops azure-pipelines azure-pipelines-yaml

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

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'
Run Code Online (Sandbox Code Playgroud)

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

- 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'
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ann 8

您可以使用dependsOn块的条件插入:

${{ if ne(parameters.DependsOn, '')}}:
  dependsOn: ${{ parameters.DependsOn }} 
Run Code Online (Sandbox Code Playgroud)

显然,您还必须DependsOn向模板声明一个参数。


Wai*_*ole 6

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
Run Code Online (Sandbox Code Playgroud)

你的模板是这样的:

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'
Run Code Online (Sandbox Code Playgroud)

并且您的管道将扩展到:

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'

Run Code Online (Sandbox Code Playgroud)