如何在 Azure DevOps 中使用具有阶段依赖性的 DependsOn
How to work with DependsOn having stage dependency in Azure DevOps
我有以下进行多阶段部署的模板:
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。我如何将值传递给模板,如果没有传递任何值,它应该继续部署,如果某些东西作为依赖项传递,它应该在安装之前验证该阶段。
您可以使用 dependsOn
块的条件插入:
${{ if ne(parameters.DependsOn, '')}}:
dependsOn: ${{ parameters.DependsOn }}
您显然还必须为您的模板声明一个 DependsOn
参数。
您在模板中声明了一个 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'
我有以下进行多阶段部署的模板:
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。我如何将值传递给模板,如果没有传递任何值,它应该继续部署,如果某些东西作为依赖项传递,它应该在安装之前验证该阶段。
您可以使用 dependsOn
块的条件插入:
${{ if ne(parameters.DependsOn, '')}}:
dependsOn: ${{ parameters.DependsOn }}
您显然还必须为您的模板声明一个 DependsOn
参数。
您在模板中声明了一个 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'