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

Azure DevOps中同Slot部署DotNet6项目与WebJobs的问题

同一Azure App Service部署槽同时部署主项目与WebJobs的解决方案

方案一:CI阶段合并主项目与WebJobs产物后统一部署

核心思路是分别构建主项目和WebJobs,将WebJobs的输出文件放到主项目解压包的App_Data/jobs/triggered/[WebJob名称]目录下,重新打包后一次性部署,彻底避免两次部署的覆盖问题。

具体YAML任务步骤

  1. 构建主项目并生成部署包
- task: VSBuild@1
  inputs:
    solution: '**/YourMainProject.sln'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)/MainApp.zip"'
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
  1. 解压主项目部署包到临时目录
- task: ExtractFiles@1
  inputs:
    archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/MainApp.zip'
    destinationFolder: '$(Build.ArtifactStagingDirectory)/MainAppUnzipped'
    cleanDestinationFolder: true
  1. 构建WebJobs项目并输出到文件系统
- task: VSBuild@1
  inputs:
    solution: '**/YourWebJobProject.sln'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=FileSystem /p:publishUrl="$(Build.ArtifactStagingDirectory)/WebJobOutput" /p:SkipInvalidConfigurations=true'
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
  1. 将WebJobs文件复制到主项目的WebJobs指定目录
- task: CopyFiles@2
  inputs:
    sourceFolder: '$(Build.ArtifactStagingDirectory)/WebJobOutput'
    contents: '**'
    targetFolder: '$(Build.ArtifactStagingDirectory)/MainAppUnzipped/App_Data/jobs/triggered/YourWebJobName'
    cleanTargetFolder: true

注意:YourWebJobName替换为你的WebJob实际名称;触发型WebJobs用triggered目录,持续运行型用continuous,目录结构必须严格遵循Azure规范。

  1. 重新打包合并后的项目文件
- task: ArchiveFiles@2
  inputs:
    rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/MainAppUnzipped'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/CombinedApp.zip'
    replaceExistingArchive: true
  1. 部署合并后的包到目标部署槽
- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: '$(YourAzureSubscription)'
    appType: 'webApp'
    WebAppName: '$(YourWebAppName)'
    deployToSlotOrASE: true
    ResourceGroupName: '$(YourResourceGroupName)'
    SlotName: '$(YourSlotName)'
    packageForLinux: '$(Build.ArtifactStagingDirectory)/CombinedApp.zip'

方案二:通过主项目.csproj配置自动包含WebJobs

如果不想在CI阶段做额外的文件复制和打包操作,可以直接在主项目的.csproj文件中添加配置,让MSBuild在构建主项目时自动将WebJobs的输出文件打包到指定路径。

主项目.csproj配置示例

在主项目的.csproj文件中添加以下ItemGroup配置:

<ItemGroup>
  <!-- 引用WebJobs项目的输出文件,替换为你的WebJobs项目相对路径 -->
  <None Include="..\YourWebJobProject\bin\$(Configuration)\net6.0\**">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
    <!-- 指定发布后的相对路径,确保WebJobs能被Azure识别 -->
    <DestinationRelativePath>App_Data/jobs/triggered/YourWebJobName/%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
  </None>
</ItemGroup>

添加配置后,直接用原有的VSBuild@1任务构建主项目,生成的部署包会自动包含WebJobs文件,无需额外CI任务,直接部署即可。

关键注意事项

  • WebJobs的目录结构必须严格符合Azure要求:触发型WebJobs放在App_Data/jobs/triggered/[JobName],持续运行型放在App_Data/jobs/continuous/[JobName],目录名称即为WebJob在Azure中的显示名称。
  • 重新打包时确保includeRootFolder设为false,避免包内多一层根目录导致路径错误。
  • 如果WebJobs依赖第三方库,需确保构建时将所有依赖文件一并输出并复制到目标目录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:05:17