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

简介: 通过GitHub Action部署Azure App Service时遇400错误,根源在于Jar包无法部署至Stack为Tomcat的应用。需将App Service运行栈改为Java SE,并可通过az CLI或curl复现验证。最终确认Kudu源码中对部署类型有严格校验。

问题描述

通过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 )

(文档链接: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。

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

成功。

 

当问题解决后,想进一步验证是否是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的状态码

 

附录一:使用 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 connection
Artifact 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

 



当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

相关文章
|
19天前
|
开发工具
【Azure 环境】使用Connect-MgGraph 命令登录中国区Azure遇见报错 AADSTS700016
使用Connect-MgGraph登录中国区Azure时,因应用ID未注册导致AADSTS700016错误。解决方法:在Azure Entra ID中注册新应用,配置正确重定向URI,并使用Client ID和Tenant ID登录即可成功。
84 13
|
7天前
|
人工智能 缓存 安全
探秘 AgentRun丨动态下发+权限隔离,重构 AI Agent 安全体系
函数计算AgentRun提供双向凭证管理:入站控制“谁可调用”,出站保障“调用谁”的安全。支持动态更新、加密存储、本地缓存与自动注入,杜绝硬编码与泄露风险,无需重启服务。让开发者专注业务,安心落地AI Agent。
|
28天前
|
人工智能 Cloud Native
云原生为基,AI为翼:回望阿里云云原生的2025年
感谢支持,新的一年继续携手同行。
|
1月前
|
数据采集 供应链 监控
什么是RFID/EPC编码-SGTIN96
SGTIN是GS1标准下的商品序列化编码,结合GTIN与唯一序列号,实现单品级标识与追溯。广泛应用于零售、供应链、防伪等领域,支持RFID自动识别,提升管理效率。可通过工具实现EPC、GS1 Digital Link、条码格式间一键转换,并支持批量生成打印,助力智能化供应链管理。
199 4
|
11天前
|
人工智能 自然语言处理 安全
Claude Code 插件登陆 VS Code:开发者迎来 AI 编程新利器
Anthropic正式发布Claude Code——VS Code官方插件,支持多语言智能补全、代码解释、错误诊断与安全重构。隐私优先、长上下文(200K tokens)处理能力强,显著优于Copilot的可解释性与代码质量,已获开发者广泛好评。(239字)
1064 4
|
1月前
|
人工智能 供应链
医疗器械唯一标识(UDI)GS1-code128码
医疗器械唯一标识(UDI)采用GS1-Code 128条码,符合全球标准,实现高效追溯。该码基于GS1系统,通过FNC1识别与AI标识符结构化数据,支持GTIN、批号、序列号等信息编码,广泛应用于医疗、物流等领域,确保产品全生命周期可追踪,提升监管与管理效率。(238字)
324 3
|
1月前
|
供应链 容器
什么是code128码?
Code 128码是一种高密度条形码,支持全ASCII字符,广泛用于物流、运输和供应链管理。它分为A、B、C三个子集,可编码字母、数字及控制符,具有高密度、小空间优势,适用于复杂数据编码需求。
484 3
|
21天前
|
存储 数据采集 弹性计算
面向多租户云的 IO 智能诊断:从异常发现到分钟级定位
当 iowait 暴涨、IO 延迟飙升时,你是否还在手忙脚乱翻日志?阿里云 IO 一键诊断基于动态阈值模型与智能采集机制,实现异常秒级感知、现场自动抓取、根因结构化输出,让每一次 IO 波动都有据可查,真正实现从“被动响应”到“主动洞察”的跃迁。
244 58
|
2月前
|
Java 中间件 Nacos
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:kratos-bootstrap 入门教程(类比 Spring Boot)
kratos-bootstrap 是 GoWind Admin 的核心引导框架,类比 Spring Boot,提供应用初始化、配置管理、组件集成等一站式解决方案。通过标准化流程与多源配置支持,开发者可快速构建企业级中后台服务,专注业务开发,降低微服务复杂度。
244 2
|
8天前
|
自然语言处理 Shell 语音技术
5 分钟上手 HarmonyOS Skill:快速集成语音与意图交互能力
本文带你5分钟上手HarmonyOS Skill,快速集成语音唤醒与意图识别能力。详解Skill概念、注册配置、onNewWant响应逻辑及语音语料设置,助你让应用听懂“打开天气”“打个招呼”等自然语言指令,轻松接入小艺(Celia)生态。(239字)
78 4