Azure DevOps矩阵策略中用Deployment作业遇“Unexpected value jobs”报错
问题:Azure DevOps矩阵策略中使用Deployment Job报错
在Azure DevOps流水线中尝试通过matrix策略批量部署多台虚拟机时,在带matrix的Job内引用包含deployment的模板,出现错误:
run-qa-deployment-job.yml(第13行,第1列):Unexpected value 'jobs'
错误原因
你当前的流水线结构违反了Azure DevOps YAML的语法规则:
- 普通Job的
steps块中只能包含任务、脚本或仅包含steps的子模板,不能直接嵌套jobs顶级节点 - 你在
DEPLOY_MATRIX_VM这个普通Job的steps里引用了run-qa-deployment-job.yml,而该模板包含了jobs节点,导致解析失败
解决方案
方案1:将模板改为Steps模板(保留普通Matrix Job)
修改run-qa-deployment-job.yml,移除jobs节点,仅保留部署所需步骤:
parameters: - name: EnvironmentName displayName: Environment Name type: string default: "MyEnvironment" - name: VMName displayName: Virtual Machine Name type: string - name: VMIndex displayName: Virtual Machine Index type: number steps: - task: PowerShell@2 displayName: Temporary inputs: targetType: 'inline' script: | Write-Host "Hello World on VM: ${{ parameters.VMName }} (Index: ${{ parameters.VMIndex }})"
主流水线run-qa-deployment-stages.yml无需修改,此时模板会作为普通步骤被Matrix Job调用。
方案2:直接在Deployment Job上应用Matrix策略(推荐,支持环境关联特性)
调整流水线结构,将Matrix策略直接应用在Deployment Job上,同时保留前置的VM名称获取Job:
parameters: - name: EnvironmentName displayName: Environment Name type: string default: "MyEnvironment" jobs: - job: GetVMNamesJob displayName: "Get VM Names" steps: - download: 1111 artifact: "VMNames" - task: PowerShell@2 name: GetVMNamesPowershell inputs: targetType: 'inline' script: | $json = Get-Content '$(Pipeline.Workspace)\1111\VMNames\VMNames.json' Write-Host $json Write-Host "##vso[task.setvariable variable=VMNames;isOutput=true]$json" - deployment: DEPLOY_MATRIX_VM dependsOn: GetVMNamesJob displayName: Deploy VMS pool: vmImage: windows-latest # 直接在Deployment Job上应用Matrix策略 strategy: matrix: $[ dependencies.GetVMNamesJob.outputs['GetVMNamesPowershell.VMNames'] ] environment: name: ${{ parameters.EnvironmentName }}.$(VMName) workspace: clean: all runOnce: deploy: steps: - checkout: none - task: PowerShell@2 displayName: Temporary inputs: targetType: 'inline' script: | Write-Host "Hello World on VM: $(VMName)"
这种方式能充分利用Deployment Job的环境关联、审批等特性,更符合部署场景的需求。
内容的提问来源于stack exchange,提问作者Dale Monks
相关产品推荐
相关产品推荐

