当前位置: 首页 > news >正文

【Azure Web App】Github Action部署Jar包到App Service报400错误

问题描述

通过github aciton部署azure app service服务的时候,遇见400报错。

报错信息非常简单:

Starting deployment for web app...
Package deployment using OneDeploy initiated.
Error: Failed to deploy web package to App Service.
Error: Deployment Failed, Error: Failed to deploy web package using OneDeploy to App Service.
Bad Request (CODE: 400)

这个问题应该如何调查呢?

 

问题解答

在Github Aciton中,使用 Azure WebApp(azure/webapps-deploy@v3)来部署App Service的应用, 这次部署的是一个jar包。

Github Action 脚本:

- name: Azure WebApp
uses: azure/webapps-deploy@v3
with:
app-name: '<app service name>'
package: ${{ github.workspace }}/target/*.jar

查看Azure文档,介绍部署java应用时,使用az cli命令,github action和maven 插件都是使用的Kudu OneDeploy接口( https://<your web app>.scm.chinacloudsites.cn/api/publish?type=jar )

image

(文档链接:https://docs.azure.cn/zh-cn/app-service/configure-language-java-deploy-run?tabs=linux&pivots=java-tomcat#deploying-your-app)

 

根据以上信息,就尝试使用az webapp deploy命令直接部署jar包应用,发现多了一句错误提示信息:

> az webapp deploy --resource-group <your resource group name> --name <your app service name> --src-path myjava.jar --type jar

Initiating deployment
Deploying from local path: myjava.jar
An error occurred during deployment. Status Code: 400,

Details: "Artifact type = 'Jar' cannot be deployed to stack = 'TOMCAT'. Site should be configured to run with stack = JAVA",

Please visit https://XXXXXXXXX.scm.chinacloudsites.cn/api/deployments/latest to get more information about your deployment

这句错误消息非常关键(Artifact type = 'Jar' cannot be deployed to stack = 'TOMCAT'. Site should be configured to run with stack = JAVA")。

在查看App Service的配置信息后,Stack果然设置为Tomcat。

image

因为这里只有两种选项( Tomcat 和Java SE )。于是,修改为Java SE后,再次部署jar包。

image

成功。

 

当问题解决后,想进一步验证是否是one deploy接口对jar包的强制限制。

恰好kudu也是开源项目,所以,进入github kudu 仓库 (源码:https://github.com/projectkudu/kudu/tree/master ),使用错误消息关键字整库搜索“cannot be deployed to stack”,最终,定位到 PushDeploymentController.cs 中,有如下的验证条件:

  • 当部署的文件为Jar时,需要判断目标App Service的Stack只能是JavaSE。如果不是,返回400的状态码

image

 

附录一:使用 curl 命令直接调用接口也可以复现问题,效果和az webapp deploy命令相同

curl -X POST \-u user:password \-T "/Users/Downloads/xxxxx-0.0.1-SNAPSHOT.jar" \"https://xxxxx.scm.chinacloudsites.cn/api/publish?type=jar" \-v* Host xxxxx.scm.chinacloudsites.cn:443 was resolved.* IPv6: (none)* IPv4: 159.27.20.0*   Trying 159.27.20.0:443...* Connected to xxxxx.scm.chinacloudsites.cn (159.27.20.0) port 443* ALPN: curl offers h2,http/1.1* (304) (OUT), TLS handshake, Client hello (1):*  CAfile: /etc/ssl/cert.pem*  CApath: none* (304) (IN), TLS handshake, Server hello (2):* (304) (OUT), TLS handshake, Client hello (1):* (304) (IN), TLS handshake, Server hello (2):* (304) (IN), TLS handshake, Unknown (8):* (304) (IN), TLS handshake, Certificate (11):* (304) (IN), TLS handshake, CERT verify (15):* (304) (IN), TLS handshake, Finished (20):* (304) (OUT), TLS handshake, Finished (20):* SSL connection using TLSv1.3 / AEAD-AES256-GCM-SHA384 / [blank] / UNDEF* ALPN: server accepted http/1.1* Server certificate:*  subject: C=CN; ST=Shanghai; O=Shanghai Blue Cloud Technology Co., Ltd.; CN=*.chinacloudsites.cn*  start date: Dec 19 00:00:00 2025 GMT*  expire date: Jun 17 23:59:59 2026 GMT*  subjectAltName: host "xxxxx.scm.chinacloudsites.cn" matched cert's "*.scm.chinacloudsites.cn"*  issuer: C=US; O=DigiCert Inc; CN=DigiCert Basic RSA CN CA G2*  SSL certificate verify ok.* using HTTP/1.x* Server auth using Basic with user 'deploypoc'> POST /api/publish?type=jar HTTP/1.1> Host: xxxxx.scm.chinacloudsites.cn> Authorization: Basic xxxxxxxxxxxxxxxx> User-Agent: curl/8.7.1> Accept: */*> Content-Length: 25578166> Expect: 100-continue> * Done waiting for 100-continue< HTTP/1.1 400 Bad Request< Content-Type: text/plain; charset=utf-8< Date: Wed, 31 Dec 2025 03:42:36 GMT< Server: Kestrel< Set-Cookie: ARRAffinity=xxxx;Path=/;HttpOnly;Secure;Domain=xxxxx.scm.chinacloudsites.cn< Set-Cookie: ARRAffinitySameSite=xxxxx;Path=/;HttpOnly;SameSite=None;Secure;Domain=xxxxx.scm.chinacloudsites.cn< Transfer-Encoding: chunked< * HTTP error before end of send, stop sending* abort upload after having sent 589824 bytes* Closing connectionArtifact type = 'Jar' cannot be deployed to stack = 'TOMCAT'. Site should be configured to run with stack = JAVA%    

 

 

参考资料

App Service部署Java应用:https://docs.azure.cn/zh-cn/app-service/configure-language-java-deploy-run?tabs=linux&pivots=java-tomcat#deploying-your-app

Kudu One Deploy Source Code : https://github.com/projectkudu/kudu/blob/master/Kudu.Services/Deployment/PushDeploymentController.cs#L304

 

http://www.jsqmd.com/news/194512/

相关文章:

  • 杂记 - 状态模式 VS. 责任链模式
  • 【干货】Google最新AI Agent报告出炉:小白程序员也能5分钟上手企业级Agent开发!效率直接翻倍,2026年你的工作将被彻底重构!
  • 托盘目标检测数据集VOC+YOLO格式4517张1类别
  • Windows OLE 零点击远程代码执行漏洞(CVE-2025-21298)技术分析与防护
  • 未来已来!Android Studio的AI Agent让编程变得如此简单,开发者:这比antigravity还牛!小白也能秒变大神,不会你就真的out了!
  • geo优化排名系统---内容式生成搜索引擎逻辑开发
  • 吐血推荐8个AI论文工具,助研究生轻松搞定论文写作!
  • 想高薪!0基础怎么转行做AI,2026挑战三个月转行AI大模型岗,需要多久?
  • 笔记本外接屏突然黑屏?我踩了 3 个坑,最后靠回退 N 卡驱动救了急
  • 英语_阅读_Baduanjing_待读
  • PID控制算法十年演进(2015–2025)
  • AI coding 智能体设计系列-03-路径上下文-如何给材料而不喂爆上下文
  • 零基础也能玩转大模型!5分钟带你从入门到精通AI智能体开发,小白程序员直接起飞!
  • 大模型学习路线图:程序员入门到精通(含300集视频教程+免费资源)_大模型学习路线(2026最新)神仙级大模型教程分享
  • CF1202E You Are Given Some Strings...
  • 2026最新银条饰品生产公司top5推荐,湖南郴州等地优质工厂/供货商解析及选择指南 - 全局中转站
  • 2026最新洗衣片工厂top5推荐榜,广东广州等地优质公司及批发源头厂家深度解析/选择指南 - 全局中转站
  • PyBullet十年演进(2015–2025)
  • 2026最新银饰生产公司top5推荐,湖南郴州等地优质工厂/供货商解析及选择指南 - 全局中转站
  • 基于非对称纳什谈判的多微网电能共享运行优化:MATLAB 实现探秘
  • 风光储互补发电系统直流微网:Simulink建模与控制策略探索
  • 卡尔曼滤波十年演进(2015–2025)
  • Nginx 七大应用场景(附配置)
  • 从T5到Sentence-BERT:打造下一代个性化推荐系统 - EmbSum深度解析
  • 开源与AI技术民主化:打破垄断的未来
  • AI 把内容做成了 “泔水”,但你的 “人味儿” 正在变贵
  • [转]Nginx 五大绝技:深入解剖与最佳实践
  • 盒马鲜生礼品卡回收有哪些方法?把睡大觉的闲置卡变成零花钱 - 京顺回收
  • 计算机毕业设计,基于springboot的高校心理教育辅导系统,附源码+数据库+论文+开题,包远程安装调试运行
  • 构造数列【牛客tracker 每日一题】