YAML流水线报错:模板文件匹配目录而非文件问题求助
问题:Azure DevOps流水线部署报错“Template file pattern matches a directory instead of a file”
我遇到以下错误,查阅相关问题后仍未解决:
Error: Template file pattern matches a directory instead of a file: /home/vsts/work/1/s
我的YAML流水线文件如下:
trigger: branches: include: - deploy-dev - adf_publish resources: repositories: - repository: CustodianDailyPipelines type: git name: 'CustodianDailyPipelines' ref: adf_publish variables: workingDir: '$(Build.SourcesDirectory)' azureSubscription: azureRMConnection: resourceGroupDev: 'Dev' resourceGroupTest: 'Test' resourceGroupProd: 'Prod' sourceDataFactory: '' deployedDataFactory: '' region: 'westeurope' artifactName: 'arm-templates-artifact' vmImageName: 'ubuntu-latest' stages: - stage: Publish displayName: Publish jobs: - job: PublishJob displayName: Copy and Publish Artifacts pool: vmImage: $(vmImageName) steps: - checkout: self - checkout: CustodianDailyPipelines path: s/CustodianDailyPipelines - script: ls -l $(workingDir)/CustodianDailyPipelines displayName: 'List Source Directory Contents' - task: CopyFiles@2 displayName: Copy files inputs: SourceFolder: '$(workingDir)/CustodianDailyPipelines/OstricaPipelines' Contents: '**/*.json' TargetFolder: '$(Build.ArtifactStagingDirectory)/ArmTemplates' - task: PublishBuildArtifacts@1 displayName: Publish build artifacts inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)/ArmTemplates' ArtifactName: '$(artifactName)' PublishLocation: 'Container' - stage: DeployDEV displayName: Deploy DEV stage condition: succeeded() jobs: - deployment: Deploy displayName: Deploy to DEV stage environment: 'development' pool: vmImage: $(vmImageName) strategy: runOnce: deploy: steps: - checkout: self - checkout: CustodianDailyPipelines path: a/CustodianDailyPipelines - download: none - task: DownloadPipelineArtifact@2 inputs: buildType: 'current' artifactName: '$(artifactName)' targetPath: '$(Pipeline.Workspace)/$(artifactName)' - script: | echo "Listing all files in the artifact directory:" ls -R $(Pipeline.Workspace)/$(artifactName) displayName: 'List all files in artifact directory' - script: | echo "Contents of ARMTemplateForFactory.json:" cat $(Pipeline.Workspace)/$(artifactName)/ARMTemplateForFactory.json echo "Contents of ARMTemplateParametersForFactory.json:" cat $(Pipeline.Workspace)/$(artifactName)/ARMTemplateParametersForFactory.json displayName: 'Verify ARM Templates' - task: AzureResourceManagerTemplateDeployment@3 inputs: deploymentScope: 'Resource Group' azureResourceManagerConnection: $(azureRMConnection) subscriptionId: $(azureSubscription) action: 'Create Or Update Resource Group' resourceGroupName: $(resourceGroupDev) location: $(region) templateLocation: 'Linked artifact' csmFileLink: '$(Pipeline.Workspace)/$(artifactName)/ARMTemplateForFactory.json' csmParametersFileLink: '$(Pipeline.Workspace)/$(artifactName)/ARMTemplateParametersForFactory.json' overrideParameters: '-dataFactoryName $(deployedDataFactory) -environment development' deploymentMode: 'Incremental'
分支说明
- adf_publish:用于提取数据工厂的ARM JSON模板
- deploy-dev:基于主分支的特性分支,包含所有ADF资源及YAML流水线文件
问题分析与修复方案
核心原因
错误源于AzureResourceManagerTemplateDeployment@3任务参数配置错误:
- 使用了
csmFileLink参数(用于指定远程URL),但实际传入的是本地文件路径 templateLocation参数与文件路径类型不匹配
具体修复步骤
修正部署任务参数
将AzureResourceManagerTemplateDeployment@3任务的参数改为本地文件模式,替换csmFileLink为csmFile,并调整templateLocation:- task: AzureResourceManagerTemplateDeployment@3 inputs: deploymentScope: 'Resource Group' azureResourceManagerConnection: $(azureRMConnection) subscriptionId: $(azureSubscription) action: 'Create Or Update Resource Group' resourceGroupName: $(resourceGroupDev) location: $(region) templateLocation: 'Local file' csmFile: '$(Pipeline.Workspace)/$(artifactName)/ARMTemplateForFactory.json' csmParametersFile: '$(Pipeline.Workspace)/$(artifactName)/ARMTemplateParametersForFactory.json' overrideParameters: '-dataFactoryName $(deployedDataFactory) -environment development' deploymentMode: 'Incremental'移除冗余的Checkout步骤
部署阶段无需再次拉取代码仓库,删除以下步骤避免路径干扰:# 删除这两行 - checkout: self - checkout: CustodianDailyPipelines path: a/CustodianDailyPipelines验证文件路径准确性
保留现有的目录列表脚本,确认下载的工件中确实包含目标JSON文件,路径与配置一致。若文件不存在,需检查Publish阶段的CopyFiles@2任务:- 确认
SourceFolder路径是否正确指向包含ARM模板的目录 - 添加脚本打印源目录结构,排查文件是否存在:
- script: | echo "Source directory structure:" ls -R $(workingDir)/CustodianDailyPipelines/OstricaPipelines displayName: 'Check Source Template Files'
- 确认
内容的提问来源于stack exchange,提问作者Αθανάσιος Σουλιώτης
相关产品推荐
相关产品推荐

