在Azure Data Factory的YAML模板CI/CD管道中配置预部署审批
我已通过YAML模板在Azure DevOps中为Azure Data Factory成功创建CI/CD管道,这与使用Azure DevOps「经典编辑器」创建的管道不同。使用经典编辑器创建构建/发布管道时,我可设置预部署选项,尤其希望配置「预部署审批」,请问能否通过YAML模板实现类似功能?
我的原YAML代码如下:
# Starter pipeline # Start with a minimal pipeline that you can customize to build and deploy your code. # Add steps that build, run tests, deploy, and more: # https://aka.ms/yaml trigger: - adf_publish pool: vmImage: ubuntu-latest steps: - script: | tree $(System.DefaultWorkingDirectory) displayName: Show file structure of System.DefaultWorkingDirectory during a build - task: AzurePowerShell@5 inputs: displayName: PreDeployment azureSubscription: 'NewConnectionName' ScriptType: 'FilePath' ScriptPath: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/PrePostDeploymentScript.ps1' ScriptArguments: '-armTemplate "$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateForFactory.json" -ResourceGroupName $(ResourceGroup) -DataFactoryName $(DataFactory) -predeployment $true -deleteDeployment $false' azurePowerShellVersion: 'LatestVersion' - task: AzureResourceManagerTemplateDeployment@3 inputs: deploymentScope: 'Resource Group' azureResourceManagerConnection: 'NewConnectionName' subscriptionId: '5fa2700d-738a-444e-a643-28241a29d08d' action: 'Create Or Update Resource Group' resourceGroupName: '$(ResourceGroup)' location: '$(Location)' templateLocation: 'Linked artifact' csmFile: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateForFactory.json' csmParametersFile: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateParametersForFactory.json' overrideParameters: '-factoryName $(DataFactory)' deploymentMode: 'Incremental' - task: AzurePowerShell@5 inputs: azureSubscription: 'NewConnectionName' ScriptType: 'FilePath' ScriptPath: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/PrePostDeploymentScript.ps1' ScriptArguments: '-armTemplate "$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateForFactory.json" -ResourceGroupName $(ResourceGroup) -DataFactoryName $(DataFactory) -predeployment $false -deleteDeployment $true' azurePowerShellVersion: 'LatestVersion'
我尝试用ManualIntervention或ManualValidation任务实现审批,但均报错:
- 使用ManualIntervention任务时:
Job Job: Step references task 'ManualIntervention' at version '8.238.0' which is not valid for the given job target.
- 加入网上的ManualValidation代码后:
/caplogic-warehouse-dev-df/azure-pipelines-5.yml (Line: 77, Col: 1): Unexpected value 'jobs'
- 调整代码后仍报错:
Job Job: Step references task 'ManualValidation' at version '0.238.0' which is not valid for the given job target.
核心问题是:ManualValidation任务只能在pool: server的独立Job中运行,不能与使用虚拟机代理(如ubuntu-latest)的Job混合在同一层级。原YAML使用了简化的steps结构,未显式定义Job,直接添加jobs会导致结构冲突。
需要将管道拆分为多个独立Job,通过dependsOn控制执行顺序:
- 构建/预部署Job:使用虚拟机代理执行脚本和预部署操作
- 手动审批Job:使用server pool运行ManualValidation,依赖第一个Job完成
- 正式部署/后部署Job:依赖审批Job通过,执行部署和后部署操作
修改后的完整YAML代码:
# Starter pipeline trigger: - adf_publish jobs: # 第一步:构建与预部署操作 - job: Build_PreDeploy displayName: Build and Pre-Deployment pool: vmImage: ubuntu-latest steps: - script: | tree $(System.DefaultWorkingDirectory) displayName: Show file structure - task: AzurePowerShell@5 inputs: displayName: PreDeployment azureSubscription: 'NewConnectionName' ScriptType: 'FilePath' ScriptPath: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/PrePostDeploymentScript.ps1' ScriptArguments: '-armTemplate "$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateForFactory.json" -ResourceGroupName $(ResourceGroup) -DataFactoryName $(DataFactory) -predeployment $true -deleteDeployment $false' azurePowerShellVersion: 'LatestVersion' # 第二步:手动审批环节 - job: WaitForApproval displayName: Wait for Pre-Deployment Approval pool: server timeoutInMinutes: 4320 # 3天超时 dependsOn: Build_PreDeploy steps: - task: ManualValidation@0 timeoutInMinutes: 1440 # 1天超时 inputs: notifyUsers: | someone@example.com instructions: '请验证构建配置,确认后继续部署' onTimeout: 'resume' # 超时自动继续,可选'cancel'终止 # 第三步:正式部署与后部署操作 - job: Deploy_PostDeploy displayName: Deployment and Post-Deployment pool: vmImage: ubuntu-latest dependsOn: WaitForApproval steps: - task: AzureResourceManagerTemplateDeployment@3 inputs: deploymentScope: 'Resource Group' azureResourceManagerConnection: 'NewConnectionName' subscriptionId: '5fa2700d-738a-444e-a643-28241a29d08d' action: 'Create Or Update Resource Group' resourceGroupName: '$(ResourceGroup)' location: '$(Location)' templateLocation: 'Linked artifact' csmFile: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateForFactory.json' csmParametersFile: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateParametersForFactory.json' overrideParameters: '-factoryName $(DataFactory)' deploymentMode: 'Incremental' - task: AzurePowerShell@5 inputs: azureSubscription: 'NewConnectionName' ScriptType: 'FilePath' ScriptPath: '$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/PrePostDeploymentScript.ps1' ScriptArguments: '-armTemplate "$(System.DefaultWorkingDirectory)/caplogic-warehouse-dev-df/ARMTemplateForFactory.json" -ResourceGroupName $(ResourceGroup) -DataFactoryName $(DataFactory) -predeployment $false -deleteDeployment $true' azurePowerShellVersion: 'LatestVersion'
关键注意点
- 拆分Job后,每个Job需明确指定对应的pool:虚拟机代理用于执行脚本/部署任务,server pool仅用于ManualValidation
- 用
dependsOn确保执行顺序:构建预部署完成→进入审批→审批通过后执行正式部署 - 原代码中的
"需替换为普通双引号",避免脚本参数解析错误 onTimeout可设置为cancel(超时终止管道)或resume(超时自动继续),根据需求调整
内容的提问来源于stack exchange,提问作者Patterson

