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

AzureWebApp@1部署时删除同WebApp下其他WebJob文件问题

问题描述

在同一Azure Web App上部署了20个左右的触发式WebJob,使用Azure Pipeline(仅jobName参数不同的YML)构建部署时出现异常:

  • 首次部署WebJob1,文件正常存放于c:\home\site\wwwroot\app_data\Jobs\Triggered\WebJob1;
  • 部署WebJob2后,自身文件能正常放到c:\home\site\wwwroot\app_data\Jobs\Triggered\WebJob2,但WebJob1的所有文件被全部删除;
  • 再次运行WebJob1的Pipeline,WebJob2的文件又会被删除。

共用的Pipeline YML代码如下:

trigger:
- DEV

pool:
  name: Dev Pipeline Pool

variables:
  - name: jobName
    value: TestWebJob
  - name: jobType
    value: Triggered
  - name: serviceConnectionToDeployTo1
    value: devApp-sc
  - name: appServiceName
    value: devApp

resources:
   repositories:
   - repository: WebJobLib
     type: git
     name: WebJobLib
     ref: master

steps:
- checkout: self
- checkout: WebJobLib

- task: DotNetCoreCLI@2
  displayName: Run dotnet build
  inputs:
    command: build
    projects: '**/*.csproj'
    arguments: --configuration release
    
- task: DotNetCoreCLI@2
  displayName: Run dotnet publish
  inputs:
    command: publish
    publishWebProjects: false
    projects: '**/*.csproj'
    arguments: --output $(Build.SourcesDirectory)/publish_output/app_data/Jobs/$(jobType)/$(jobName)
    zipAfterPublish: false
    modifyOutputPath: false

- task: ArchiveFiles@2
  displayName: Archive published output
  inputs:
    rootFolderOrFile: $(Build.SourcesDirectory)/publish_output
    includeRootFolder: false
    archiveType: zip
    archiveFile: $(System.DefaultWorkingDirectory)/$(Build.BuildId).zip
    replaceExistingArchive: true
    verbose: true

- task: AzureWebApp@1
  displayName: Azure Web App Deploy
  inputs:
    azureSubscription: $(serviceConnectionToDeployTo1)
    appType: webApp
    appName: $(appServiceName)
    package: $(System.DefaultWorkingDirectory)/$(Build.BuildId).zip
    deploymentMethod: auto
排查思路&解决办法

1. 问题根源:AzureWebApp部署任务的默认行为

你当前使用的AzureWebApp@1任务,当部署包中包含app_data/Jobs目录时,默认会替换服务器上整个app_data/Jobs目录,而非增量添加新的WebJob文件夹。由于每个Pipeline仅打包当前WebJob的内容,部署时自然会覆盖删除其他WebJob的文件。

2. 具体排查点

  • 验证部署方式日志:deploymentMethod: auto会自动选择部署方式(通常为Zip Deploy),而Zip Deploy默认是全量替换指定目录。前往Azure Portal的Web App部署中心查看日志,确认部署时是否执行了目录覆盖操作。
  • 检查打包内容:查看Pipeline生成的Zip包,确认仅包含当前WebJob的app_data/Jobs/Triggered/[jobName]目录,无其他WebJob的文件。若打包内容有误也会引发问题,但你的场景核心是全量替换导致的文件删除。

3. 解决办法

办法一:指定自定义部署路径

修改AzureWebApp@1任务,明确只部署到当前WebJob的具体目录,避免触碰整个app_data/Jobs:

- task: AzureWebApp@1
  displayName: Azure Web App Deploy
  inputs:
    azureSubscription: $(serviceConnectionToDeployTo1)
    appType: webApp
    appName: $(appServiceName)
    package: $(System.DefaultWorkingDirectory)/$(Build.BuildId).zip
    deploymentMethod: zipDeploy
    enableCustomDeployment: true
    customDeploymentPath: '/site/wwwroot/app_data/Jobs/$(jobType)/$(jobName)'

注意:需将deploymentMethod显式设置为zipDeploy,auto模式不支持自定义部署路径。

办法二:用Additional Arguments实现增量部署(推荐)

在AzureWebApp@1中添加additionalArguments参数,告知Kudu仅部署到指定子目录:

- task: AzureWebApp@1
  displayName: Azure Web App Deploy
  inputs:
    azureSubscription: $(serviceConnectionToDeployTo1)
    appType: webApp
    appName: $(appServiceName)
    package: $(System.DefaultWorkingDirectory)/$(Build.BuildId).zip
    deploymentMethod: auto
    additionalArguments: '--setParameters filePath="app_data/Jobs/$(jobType)/$(jobName)"'

该参数会让Kudu仅将Zip包内容部署到指定子目录,不会影响其他WebJob的文件。

办法三:使用Azure CLI直接部署

若上述方法无效,可改用Azure CLI任务直接部署WebJob,精准度更高:

- task: AzureCLI@2
  displayName: Deploy WebJob via Azure CLI
  inputs:
    azureSubscription: $(serviceConnectionToDeployTo1)
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      az webapp deployment source config-zip --resource-group <你的资源组名称> --name $(appServiceName) --src $(System.DefaultWorkingDirectory)/$(Build.BuildId).zip --type zip --target-path "/site/wwwroot/app_data/Jobs/$(jobType)/$(jobName)"

替换<你的资源组名称>为Web App所在的资源组名称。

4. 额外验证步骤

  • 部署完成后,登录Web App的Kudu控制台(https://<你的App服务名>.scm.azurewebsites.net/DebugConsole),查看site/wwwroot/app_data/Jobs/Triggered目录下的文件是否完整。
  • 在Pipeline中添加步骤,打印Zip包内容,确认打包路径和文件是否正确:
- task: CmdLine@2
  displayName: 查看Zip包内容
  inputs:
    script: |
      powershell -Command "Expand-Archive -Path $(System.DefaultWorkingDirectory)/$(Build.BuildId).zip -DestinationPath $(Build.SourcesDirectory)/temp_unzip"
      dir $(Build.SourcesDirectory)/temp_unzip

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:59:59