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

在YAML流水线中将多个Azure WebJobs部署到单个Azure AppService的问题

核心问题原因

你遇到的覆盖问题由两个原因导致:

  1. 默认zipDeploy部署逻辑会清空App Service wwwroot目录下所有不在当前部署包内的文件
  2. 原有流水线仅支持单个WebJob的构建打包,多流水线独立部署自然会互相覆盖

修改后可直接使用的流水线配置

trigger: none
    
pool:
  vmImage: ubuntu-latest
    
# 修改变量即可匹配你的业务配置
variables:
  webJobNames: # 替换成你的3个WebJob的项目名称
    - 'My.WebJob.App1'
    - 'My.WebJob.App2'
    - 'My.WebJob.App3'
  azureAppServiceName: 'my-webjobs'
  azureSPNName: 'MyRGConnection'
  buildConfiguration: 'Release'
  dotNetFramework: 'net6.0'
  dotNetVersion: '6.0.x'
  targetRuntime: 'win-x86'

steps:
- task: UseDotNet@2
  inputs:
    version: $(dotNetVersion)
    includePreviewVersions: true
  displayName: '安装指定版本.NET SDK'

# 循环处理所有WebJob的构建发布
- ${{ each webJobName in variables.webJobNames }}:
  - task: DotNetCoreCLI@2
    inputs:
      command: publish
      publishWebProjects: false
      arguments: '--configuration $(BuildConfiguration) --framework $(dotNetFramework) --runtime $(targetRuntime) --self-contained --output $(Build.ArtifactStagingDirectory)/WebJob/App_Data/jobs/continuous/${{ webJobName }}'
      zipAfterPublish: false
      modifyOutputPath: false
      projects: '${{ webJobName }}/${{ webJobName }}.csproj'
    displayName: '构建发布WebJob: ${{ webJobName }}'

  - task: PowerShell@2
    displayName: 生成${{ webJobName }}的run.cmd启动文件
    inputs:
      targetType: 'inline'
      script: '"dotnet ${{ webJobName }}.dll" | Out-File run.cmd -Encoding ASCII; $LASTEXITCODE'
      pwsh: true
      workingDirectory: '$(Build.ArtifactStagingDirectory)/WebJob/App_Data/jobs/continuous/${{ webJobName }}'

# 统一打包所有WebJob到同一个部署包
- task: ArchiveFiles@2
  displayName: 打包所有WebJob部署文件
  inputs:
    rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/WebJob/'
    includeRootFolder: false
    archiveType: 'zip'
    archiveFile: '$(Build.ArtifactStagingDirectory)/AllWebJobs.zip'
    replaceExistingArchive: true

- task: PublishPipelineArtifact@1
  displayName: 发布构建产物
  inputs:
    targetPath: '$(Build.ArtifactStagingDirectory)'
    publishLocation: 'pipeline'

- task: DownloadPipelineArtifact@2
  displayName: 下载构建产物
  inputs:
    path: '$(System.ArtifactsDirectory)'

# 部署时关闭文件删除逻辑
- task: AzureWebApp@1
  inputs:
    azureSubscription: $(azureSPNName)
    appType: 'webApp'
    appName: $(azureAppServiceName)
    package: '$(System.ArtifactsDirectory)/AllWebJobs.zip'
    deploymentMethod: 'zipDeploy'
    enableCustomDeployment: true
    RemoveAdditionalFiles: false # 对应Visual Studio部署时不清除现有文件的选项

关键改动说明

  • 用YAML循环逻辑批量处理3个WebJob的构建、启动文件生成逻辑,无需重复复制代码
  • 所有WebJob的发布文件都放到同一个待打包目录,最终生成包含全部3个WebJob的统一部署包
  • 部署时新增RemoveAdditionalFiles: false配置,关闭zipDeploy默认的多余文件清理逻辑,避免覆盖已有的WebJob文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:27:04