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

Azure DevOps Pipeline未正确发布网站工件:缺失必要文件和文件夹

问题:Azure DevOps Pipeline发布工件缺失必要文件/文件夹
  • 开发用于构建发布网站的Azure DevOps Pipeline,当前生成的工件缺少网站运行必需的文件和文件夹,例如website/App_Config和bin/roslyn
  • 已确认构建步骤可正常生成.dll等核心输出文件,但部分关键文件/文件夹未在发布步骤中被复制
  • 目标是实现与同事本地构建完全一致的Pipeline输出,目前对Azure DevOps内置变量的文件处理逻辑存在困惑

预期工件应包含类似本地构建的目录结构:包含App_Config目录、bin/roslyn目录及相关运行依赖文件


当前Pipeline代码

# This YAML pipeline is 'Part I' of two Pipelines for building and deploying WEB 2.0 Backend App 
# The pipeline includes stages for building, testing and publishing the solution


parameters:
  - name: cleanWorkspace
    displayName: 'Clean Workspace'
    type: boolean
    default: true
  - name: cleanOutput
    displayName: 'Clean Output'
    type: boolean
    default: true
#  - name: triggerPipeline
#    displayName: 'Trigger Pipeline Automatically'
#    type: boolean
#    default: true

#trigger:
# branches:
#   only:
#     - main

variables:
  adoRepoName: aquarium-cms
  azureSub: HAWeb2-CFS-NonProd
  acl: 'False'
  base-output-directory: '$(Build.ArtifactStagingDirectory)'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  artifactName: aquarium
  artifactBuildVersion: 'Build:$(Build.BuildId)-BuildNumber:$(Build.BuildNumber)'
  NuGet: nuget.config
  solution: aquarium-cms.sln
  workspaceClean: $(if eq(parameters.cleanWorkspace, true),all,none)
  workspaceCleanOutputs: $(if eq(parameters.cleanOutput, true),all,none)
  resolvedStagingFolder: Resolve-Path $wwwroot
  msbArgsA: '/t:Clean,Build /p:ProjectName="**/*.csproj" /p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:publishUrl="$(resolvedStagingFolder)"'
  msbuildArgs: '$(msbArgsA)'

pool:
  vmImage: 'windows-2019'


stages:
- stage: Build_Solution
  jobs:
  - job:
    workspace:
      clean: ${{ variables.workspaceClean }}
    displayName: 'Build solution'
    steps:
    - task: NuGetCommand@2
      inputs:
        command: 'restore'
        restoreSolution: '**/*.sln'
        feedsToUse: 'config'
        nugetConfigPath: 'nuget.config'
    - task: PowerShell@2
      displayName: 'Aquarium Diagnostics'
      inputs:
        targetType: inline
        script: "dir env: | sort-object Name; Get-ChildItem -Recurse -File | format-table"
    - task: MSBuild@1
      inputs:
        solution: '**/*.sln'
        platform: '$(buildPlatform)'
        configuration: '$(buildConfiguration)'
        msbuildArguments: '$(msbuildArgs)'
        clean: true
        createLogFile: true
        logFileVerbosity: 'detailed'


    - task: PowerShell@2
      displayName: 'CD Diagnostics'
      inputs:
        targetType: inline
        script: "dir env: | sort-object Name; Get-ChildItem -Recurse -File | format-table"

    - task: CmdLine@2
      displayName: 'List build artifacts'
      inputs:
        script: 'dir $(base-output-directory)'


#- stage: Run Tests
#  jobs: 
#  - job: RunAutomatedTests
#    displayName: 'Run Automated Tests'
#    steps:
#    - task: VSTest@2
#      displayName: 'Run automated tests'
#      inputs:
#        testAssemblyVer2: |
#          **\*test*.dll
#          !**\*TestAdapter.dll
#          !**\obj\**
#        searchFolder: '$(System.DefaultWorkingDirectory)'
#        platform: '$(buildPlatform)'
#       configuration: '$(BuildConfiguration)'

#    - task: PublishBuildArtifacts@1
#      inputs:
#        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
#        ArtifactName: '$(artifactName)'
#        publishLocation: 'Container'
     
    - task: PublishPipelineArtifact@1
      inputs:
        targetPath: '$(base-output-directory)'
        artifact: '$(artifactName)'
        publishLocation: 'pipeline'

核心修复方向

1. 修正MSBuild参数配置

当前配置存在3个关键问题:

  • resolvedStagingFolder是PowerShell命令,直接作为MSBuild参数会被解析为字符串而非实际路径
  • PackageAsSingleFile=true会将输出打包为单个zip文件,而非你需要的展开式目录结构
  • publishUrl未关联到$(Build.ArtifactStagingDirectory),导致构建输出未进入工件暂存区

修改变量与MSBuild参数:

variables:
  # 替换原resolvedStagingFolder定义
  publishOutputDir: '$(Build.ArtifactStagingDirectory)/website'
  # 替换原msbArgsA、msbuildArgs定义
  msbuildArgs: '/t:Clean,Build /p:DeployOnBuild=true /p:WebPublishMethod=FileSystem /p:PublishDir="$(publishOutputDir)" /p:SkipInvalidConfigurations=true'
  • 使用WebPublishMethod=FileSystem直接输出到指定目录,避免打包
  • 明确指定PublishDir为$(Build.ArtifactStagingDirectory)的子目录,确保输出进入待发布工件区

2. 确保必要文件被包含进构建输出

  • 检查项目文件(.csproj),将App_Config等目录设置为复制到输出目录:
<ItemGroup>
  <Content Include="App_Config\**">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
  • 确认项目引用了Microsoft.Net.Compilers包,确保bin/roslyn目录及文件能被正确复制到输出

3. 关键内置变量理解

  • $(Build.ArtifactStagingDirectory):Pipeline专属的工件暂存目录,所有需要发布的文件必须先复制到这里
  • $(System.DefaultWorkingDirectory):代码仓库克隆到代理机器的工作目录,即构建的起始目录
  • PublishPipelineArtifact@1只会发布targetPath指定路径下的内容,必须确保构建输出最终落到该路径

4. 调试验证步骤

在Pipeline中添加步骤,确认输出目录内容:

- task: CmdLine@2
  displayName: 'Check publish output details'
  inputs:
    script: 'dir $(publishOutputDir) /s'

对比本地构建的输出目录与Pipeline中publishOutputDir的内容,定位差异点


内容的提问来源于stack exchange,提问作者DemantCHRX

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:03:13