Azure devops 具有条件手动批准作业的DevOps模板
我正在尝试根据阶段添加审批作业,我正在使用模板,希望跳过某些阶段的审批:Azure devops 具有条件手动批准作业的DevOps模板,azure-devops,azure-pipelines,azure-pipelines-release-pipeline,azure-pipelines-yaml,Azure Devops,Azure Pipelines,Azure Pipelines Release Pipeline,Azure Pipelines Yaml,我正在尝试根据阶段添加审批作业,我正在使用模板,希望跳过某些阶段的审批: parameters: - name: Stage type: string - name: Environment type: string - name: WebAppName type: string - name: ArtifactName type: string - name: DependsOn type: object default: [] - name: Subscriptio
parameters:
- name: Stage
type: string
- name: Environment
type: string
- name: WebAppName
type: string
- name: ArtifactName
type: string
- name: DependsOn
type: object
default: []
- name: Subscription
type: string
- name: isApproval
type: boolean
default: false
stages:
############################################################
# Deploy stages
############################################################
- stage: ${{ parameters.Stage }}
displayName: '${{ parameters.Stage }} Stage'
dependsOn: '${{ parameters.DependsOn }}' # this will execute based on the stage that is passed.
jobs:
- job: approval
condition: eq('${{ parameters.isApproval }}', true)
pool:
vmImage: 'windows-latest'
steps:
- task: ManualIntervention@8
timeoutInMinutes: 1440 # task times out in 1 day
inputs:
emailRecipients: 'example@example.com'
instructions: 'Please validate the build configuration and resume'
- deployment: ${{ parameters.Environment }}
${{ if eq('${{ parameters.isApproval }}', true)}}:
dependsOn: approval
timeoutInMinutes: 70
environment: '${{ parameters.Environment }} Environment'
pool:
vmImage: 'windows-latest'
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: ${{ parameters.Subscription }}
appType: 'webApp'
WebAppName: ${{ parameters.WebAppName }}
package: '$(System.ArtifactsDirectory)/**/*.zip'
现在从发布管道,我将值传递给模板:
- template: stages\deploy.yml
parameters:
Environment: 'Dev'
WebAppName: 'azureappservicehelloworldapp-dev'
Stage: 'Dev'
ArtifactName : '$(ArtifactName)'
Subscription: 'AzureConnectionSC'
# empty DependsOn, as Dev depends on nothing
DependsOn:
- Build
- template: stages\deploy.yml
parameters:
Environment: 'UAT'
WebAppName: 'azureappservicehelloworld-uat'
Stage: 'UAT'
ArtifactName : '$(ArtifactName)'
Subscription: 'AzureConnectionSC'
DependsOn:
- Dev
isApproval: true
- template: stages\deploy.yml
parameters:
Environment: 'Prod'
WebAppName: 'azureappservicehelloworld'
Stage: 'Prod'
ArtifactName : '$(ArtifactName)'
Subscription: 'AzureConnectionSC'
DependsOn:
- UAT
isApproval: true
如果您看到从UAT和Prod模板发送的IsApproval为true,那么我应该能够验证UAT和Prod的批准,并且开发人员应该在没有任何批准的情况下部署
但我在模板中得到了以下批准作业的错误:
- template: stages\deploy.yml
parameters:
Environment: 'Dev'
WebAppName: 'azureappservicehelloworldapp-dev'
Stage: 'Dev'
ArtifactName : '$(ArtifactName)'
Subscription: 'AzureConnectionSC'
# empty DependsOn, as Dev depends on nothing
DependsOn:
- Build
- template: stages\deploy.yml
parameters:
Environment: 'UAT'
WebAppName: 'azureappservicehelloworld-uat'
Stage: 'UAT'
ArtifactName : '$(ArtifactName)'
Subscription: 'AzureConnectionSC'
DependsOn:
- Dev
isApproval: true
- template: stages\deploy.yml
parameters:
Environment: 'Prod'
WebAppName: 'azureappservicehelloworld'
Stage: 'Prod'
ArtifactName : '$(ArtifactName)'
Subscription: 'AzureConnectionSC'
DependsOn:
- UAT
isApproval: true
手动干预任务出现错误,请提供任何建议。手动干预任务仅适用于经典版本,并且仅适用于版本的无代理作业阶段 在您的情况下,我要做的是向管道中注入两个新的占位符环境,每个环境都有批准要求,但不部署任何内容:
-模板:stages\deploy.yml
参数:
环境:“Dev”
WebAppName:“azureappservicehelloworldapp开发”
阶段:'开发'
工件名称:'$(工件名称)'
订阅:'AzureConnectionSC'
#空DependsOn,因为Dev不依赖任何东西
德彭森:
-建造
-阶段:批准
显示名称:“UAT批准阶段”
德彭森:“德夫”
工作:
-部署:核准
环境:“UAT批准环境”
游泳池:
vmImage:“windows最新版本”
战略:
跳动:
部署:
步骤:
-pwsh:编写主机“占位符批准部署”
-模板:stages\deploy.yml
参数:
环境:“UAT”
WebAppName:“azureappservicehelloworld uat”
阶段:“UAT”
工件名称:'$(工件名称)'
订阅:'AzureConnectionSC'
德彭森:
-批准
我同意:是的
-阶段:批准
displayName:“产品批准阶段”
德彭森:“UAT”
工作:
-部署:PRODApproval
环境:“产品批准环境”
游泳池:
vmImage:“windows最新版本”
战略:
跳动:
部署:
步骤:
-pwsh:编写主机“占位符批准部署”
-模板:stages\deploy.yml
参数:
环境:“Prod”
WebAppName:“azureappservicehelloworld”
阶段:“Prod”
工件名称:'$(工件名称)'
订阅:'AzureConnectionSC'
德彭森:
-产品批准
我同意:是的
如果愿意,您可以像其他部署阶段一样“模板化”这些阶段。手动干预任务有一个
runOn:“server”
设置,因此您不能在代理上运行它,它在应用层上运行
这意味着您不能使用:
pool:
vmImage: 'windows-latest'
结果是它引发了一次审查。正如所料
不管出于什么原因ManualIntervention@8任务在YAML上下文中具有不受支持的任务执行处理程序。所以你可以用ManualValidation@0,但不是ManualIntervention@8.谢谢你,它成功了ManualIntervention@8以及没有问题,什么是不支持的ManualIntervention@8?我收回它,我得到错误:错误分析手动干预(手动干预)ID:bcb64569-d51a-4af0-9c01-ea5d05b3b622的任务定义的任务执行部分缺失或无效。是的,
ManualIntervention
使用“执行”:{“RM:ManualIntervention”:{}
,YAML管道扩展不支持该部分。ManualValidation
任务没有为执行处理程序使用RM:
命名空间。错误消息和任务显示在YAML编辑器中的事实非常令人困惑。我猜Microsoft在某个时候不赞成为YAML执行此任务。文档说它不受支持,但在某些情况下它显然可以工作。在UATProval或ProdApproval阶段如何包括手动干预,我只看到pwsh:Write Host“Placeholder approval deployment”。这一步如何进行手动干预?它的作用是运行一个简单的作业(写入一些输出)。然后停下来。然后在Azure管道中对环境本身设置批准条件。一旦作业运行,下一个作业将不会运行,直到有人批准您刚刚“部署”的琐碎工作。