Azure DevOps部署报错:找不到指定Zip包,如何优化重复YAML代码?
问题描述
按照MSDN说明搭建Azure DevOps流水线,需完成构建、部署到Web App两项任务,当前遇到报错:
No package found with specified pattern: D:\a\1\s***.zip
调整路径后仍出现类似位置错误,日志显示drop工件下存在文件。同时希望确认能否移除两个YAML中的重复代码(如NuGet相关步骤)。
附现有两个YAML文件:
Build YAML
trigger: - master pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '$(solution)' - task: VSBuild@1 inputs: solution: '$(solution)' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: VSTest@2 inputs: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(System.DefaultWorkingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
Deploy YAML
trigger: - master pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '$(solution)' - task: VSBuild@1 inputs: solution: '$(solution)' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: VSTest@2 inputs: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: AzureWebApp@1 inputs: azureSubscription: 'NEW_SUB' appType: 'webApp' appName: 'Testing' package: '$(System.DefaultWorkingDirectory)/**/*.zip' deploymentMethod: 'auto'
解决方案
一、解决找不到Zip包的错误
问题根源
- Build流水线发布路径错误:当前
PublishBuildArtifacts@1任务发布的是整个$(System.DefaultWorkingDirectory)目录,但实际需要发布的是VSBuild生成的、存放在$(build.artifactStagingDirectory)下的WebApp.zip。 - Deploy流水线重复执行构建逻辑:Deploy阶段不需要重新做NuGet还原、构建、测试,应直接下载Build阶段生成的工件包进行部署。
修复步骤
1. 修正Build YAML的发布任务
将PublishBuildArtifacts@1的PathtoPublish改为$(build.artifactStagingDirectory),只发布生成的压缩包:
- task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(build.artifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
2. 重构Deploy YAML,移除重复构建步骤
Deploy流水线仅保留下载工件和部署的步骤:
trigger: none # 建议取消自动触发,通过Build流水线的后续阶段或手动触发部署 pool: vmImage: 'windows-latest' steps: # 下载Build流水线生成的drop工件 - task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'drop' downloadPath: '$(System.ArtifactsDirectory)' # 部署到Azure Web App - task: AzureWebApp@1 inputs: azureSubscription: 'NEW_SUB' appType: 'webApp' appName: 'Testing' package: '$(System.ArtifactsDirectory)/drop/WebApp.zip' # 直接指定工件内的zip路径 deploymentMethod: 'auto'
若需Build完成后自动触发Deploy,可在Build流水线中添加部署阶段,或设置Deploy流水线的触发条件为Build工件发布。
二、移除重复代码的方案
完全可以移除重复代码,推荐两种实现方式:
1. 单YAML分阶段执行构建与部署
将构建、部署放在同一个YAML的不同阶段,共享变量与逻辑,避免重复编写:
trigger: - master pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' packagePath: '$(build.artifactStagingDirectory)\WebApp.zip' stages: - stage: Build jobs: - job: BuildJob steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '$(solution)' - task: VSBuild@1 inputs: solution: '$(solution)' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(packagePath)" /p:DeployIisAppPath="Default Web Site"' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: VSTest@2 inputs: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(build.artifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container' - stage: Deploy dependsOn: Build condition: succeeded() jobs: - job: DeployJob steps: - task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'drop' downloadPath: '$(System.ArtifactsDirectory)' - task: AzureWebApp@1 inputs: azureSubscription: 'NEW_SUB' appType: 'webApp' appName: 'Testing' package: '$(System.ArtifactsDirectory)/drop/WebApp.zip' deploymentMethod: 'auto'
2. 用模板复用重复步骤
若必须拆分两个YAML,可将NuGet还原、构建等重复步骤抽为模板文件(如build-steps.yml),再在需要的YAML中引用:
build-steps.yml
parameters: solution: '' buildPlatform: '' buildConfiguration: '' packagePath: '' steps: - task: NuGetToolInstaller@1 - task: NuGetCommand@2 inputs: restoreSolution: '${{ parameters.solution }}' - task: VSBuild@1 inputs: solution: '${{ parameters.solution }}' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="${{ parameters.packagePath }}" /p:DeployIisAppPath="Default Web Site"' platform: '${{ parameters.buildPlatform }}' configuration: '${{ parameters.buildConfiguration }}' - task: VSTest@2 inputs: platform: '${{ parameters.buildPlatform }}' configuration: '${{ parameters.buildConfiguration }}'
Build YAML引用模板:
trigger: - master pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildPlatform: 'Any CPU' buildConfiguration: 'Release' packagePath: '$(build.artifactStagingDirectory)\WebApp.zip' steps: - template: build-steps.yml parameters: solution: '$(solution)' buildPlatform: '$(buildPlatform)' buildConfiguration: '$(buildConfiguration)' packagePath: '$(packagePath)' - task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(build.artifactStagingDirectory)' ArtifactName: 'drop' publishLocation: 'Container'
注:Deploy流水线无需构建步骤,因此单YAML分阶段的方案更适配当前场景。
内容的提问来源于stack exchange,提问作者KeithViking
相关产品推荐
相关产品推荐

