azure-pipelines - 发布到 Azure Web 应用程序子应用程序失败并显示 409 错误

标签 azure-pipelines azure-web-app-service

我们正在将我们的产品迁移到云端。我目前正在测试将我们的 Web 应用程序部署到 azure Web 应用程序。我们的应用程序由两部分组成。一个 ASP.Net Webforms 应用程序和一个 ASP.Net Web API 项目。这些项目是 2 个独立的应用程序,需要作为 2 个独立的应用程序在 azure 中运行。我已将 Web 应用程序配置如下:

enter image description here

如您所见,api 是根的子应用程序。现在我有 2 个部署任务 (AzureRmWebAppDeployment@4),用于部署网站和 API。部署网站的任务运行没有任何问题。但是,部署 api 的任务会引发错误:

Got service connection details for Azure App Service:'***'
##[error]Error: Failed to create path 'site/wwwroot/api' from Kudu. Error: Conflict (CODE: 409)
Successfully added release annotation to the Application Insight : ***
Successfully updated deployment History at https://***.scm.azurewebsites.net/api/deployments/***
App Service Application URL: http://***.azurewebsites.net/api
Finishing: Publish API to Azure

显然它无法在 wwwroot 中创建“api”文件夹。

诊断日志显示它确定“api”文件夹不存在,并且在尝试创建它时发生冲突错误:
##[debug]Virtual Application Map: Physical path: 'site\wwwroot\api'. Virtual path: '/api'.
##[debug][GET]https://$***:***@***.scm.azurewebsites.net/api/vfs/site/wwwroot/api/
##[debug]loaded affinity cookie ["ARRAffinity=***;Path=/;HttpOnly;Domain=***.scm.azurewebsites.net"]
##[debug]listFiles. Data: {"statusCode":404,"statusMessage":"Not Found","headers":{"cache-control":"no-cache","pragma":"no-cache","content-length":"57","content-type":"application/json; charset=utf-8","expires":"-1","server":"Microsoft-IIS/10.0","x-ms-request-id":"f395b98d-89ca-450e-b4f4-9df4d81f3ef0","x-aspnet-version":"4.0.30319","x-powered-by":"ASP.NET","set-cookie":["ARRAffinity=***;Path=/;HttpOnly;Domain=***.scm.azurewebsites.net"],"date":"Thu, 16 Apr 2020 13:58:57 GMT","connection":"close"},"body":{"Message":"'D:\\home\\site\\wwwroot\\api\\' not found."}}
##[debug]setting affinity cookie ["ARRAffinity=***;Path=/;HttpOnly;Domain=***.scm.azurewebsites.net"]
##[debug][PUT]https://$***:***@***.scm.azurewebsites.net/api/vfs/site/wwwroot/api/
##[debug]Encountered a retriable status code: 409. Message: 'Conflict'.
##[debug][PUT]https://$***:***@***.scm.azurewebsites.net/api/vfs/site/wwwroot/api/
##[debug]Encountered a retriable status code: 409. Message: 'Conflict'.
##[debug][PUT]https://$***:***@***.scm.azurewebsites.net/api/vfs/site/wwwroot/api/
##[debug]Encountered a retriable status code: 409. Message: 'Conflict'.
##[debug][PUT]https://$***:***@***.scm.azurewebsites.net/api/vfs/site/wwwroot/api/
##[debug]Encountered a retriable status code: 409. Message: 'Conflict'.
##[debug][PUT]https://$***:***@***.scm.azurewebsites.net/api/vfs/site/wwwroot/api/
##[debug]createPath. Data: {"statusCode":409,"statusMessage":"Conflict","headers":{"cache-control":"no-cache","pragma":"no-cache","content-length":"87","content-type":"application/json; charset=utf-8","expires":"-1","server":"Microsoft-IIS/10.0","x-ms-request-id":"5a889012-0b6c-421a-9c38-2eced7483369","x-aspnet-version":"4.0.30319","x-powered-by":"ASP.NET","date":"Thu, 16 Apr 2020 13:59:50 GMT","connection":"close"},"body":{"Message":"Cannot delete directory. It is either not empty or access is not allowed."}}
##[debug]Deployment Failed with Error: Error: Failed to create path 'site/wwwroot/api' from Kudu. Error: Conflict (CODE: 409)
##[debug]task result: Failed
##[error]Error: Failed to create path 'site/wwwroot/api' from Kudu. Error: Conflict (CODE: 409)
##[debug]Processed: ##vso[task.issue type=error;]Error: Failed to create path 'site/wwwroot/api' from Kudu. Error: Conflict (CODE: 409)
##[debug]Processed: ##vso[task.complete result=Failed;]Error: Failed to create path 'site/wwwroot/api' from Kudu. Error: Conflict (CODE: 409)

手动尝试将“api”文件夹添加到 azure web 应用程序时,我也收到错误消息:

enter image description here

部署 api 的部署任务如下所示:
  - task: AzureRmWebAppDeployment@4
    inputs:
      ConnectionType: 'AzureRM'
      azureSubscription: '***'
      appType: 'webApp'
      WebAppName: '***'
      packageForLinux: '$(Pipeline.Workspace)\API'
      VirtualApplication: 'api'
    displayName: Publish API to Azure

这里有什么交易?有没有关于如何做到这一点的教程?我在 Azure 中配置错误吗?我需要改变什么才能使这项工作?我试图查看是否可以从 Visual Studio 手动发布 API 以查看它是否在那里工作,但 Visual Studio 似乎不支持通过该界面的子应用程序。

最佳答案

问题原来是 AzureRmWebAppDeployment@4 任务自动启用了 WEBSITE_RUN_FROM_PACKAGE 设置。启用此功能会导致整个 wwwroot 文件夹变为只读。但是,界面中的任何地方都没有提到这一点。这使得无法部署子应用程序。禁用此选项可解决此问题。
我现在将尝试在将 API 子应用程序发送到 azure 之前将其包含在包中,以查看该子应用程序是否可以正常工作。否则我就不能使用“从包运行”选项,尽管它比普通部署有优势
您可以通过在任务中使用以下参数来禁用从包运行:

 - task: AzureRmWebAppDeployment@4 
   inputs:         
     packageForLinux: '<path>' 
     enableCustomDeployment: true         
     deploymentType: 'webDeploy'

关于azure-pipelines - 发布到 Azure Web 应用程序子应用程序失败并显示 409 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61231738/

相关文章:

azure - 为什么在使用 bicep 代码创建突触工作区时,devops 服务主体没有突触管理员角色

apache - 如何将工件从 Azure devops 部署到 Apache Tomcat?

node.js - 如何将环境变量添加到 Azure Devops 管道中

mongodb - 在 Azure 数据工厂中创建 MongoDB 链接服务

asp.net-mvc - VS 2015、C# 6、MVC5、Roslyn — Azure Web 应用程序上出现 502 网关错误

node.js - Azure "Web apps"服务 : auto-install npm modules from package. json

configuration - 如何在静态网页中访问 Azure Web App 配置

python - 连接到 Azure Web App 上托管的 ChromaDB 客户端时出现 ConnectTimeout 错误

azure-devops - 使用 VSTS 的 REST api 更新构建定义时出现问题

mysql - 转换 Azure Web App MySql 实现