You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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包的错误

问题根源

  1. Build流水线发布路径错误:当前PublishBuildArtifacts@1任务发布的是整个$(System.DefaultWorkingDirectory)目录,但实际需要发布的是VSBuild生成的、存放在$(build.artifactStagingDirectory)下的WebApp.zip。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:04:58