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
相关产品推荐
相关产品推荐

