配置Gradle azurewebapp插件部署SpringBoot的Bitbucket CD问题
方案可行性结论
Bitbucket Pipelines部署SpringBoot Jar到Azure App Service的方案完全合理,不需要强制更换Azure Pipeline。如果你们的代码托管、评审、CI流程已经全部跑在Bitbucket上,直接复用Bitbucket Pipelines做CD是投入产出比最高的选择,跨平台对接Azure Pipeline反而需要额外处理账号打通、代码同步、权限打通的问题,维护成本更高。Azure Pipeline更适合全研发流程都基于Azure DevOps搭建的团队。
流水线变量获取说明
你列出的AZURE_APP_ID/AZURE_PASSWORD/AZURE_TENANT_ID三个认证参数,都不是现有App Service的属性,也不是你个人管理员账号的登录凭证,本质是Azure AD服务主体的认证信息——Bitbucket通过这个预授权的服务主体获得操作Azure资源的权限,全程无交互,完全适配自动化CD流程。各变量的具体获取方式如下:
AZURE_TENANT_ID
该值是你Azure账号所属组织(租户)的全局唯一标识,相当于整个Azure资源目录的身份ID。
获取路径:登录Azure门户,进入「Azure Active Directory」服务,在概述页面直接复制「租户ID」字段即可。AZURE_APP_ID
该值不是你部署的SpringBoot应用对应的App Service ID,是Azure AD应用注册(即服务主体)的客户端ID。
获取步骤:- 在Azure Active Directory页面进入「应用注册」菜单,点击「新注册」
- 名称可自定义(比如
bitbucket-cd-sp),受支持账户类型选择「仅此组织目录中的账户」,重定向URI无需填写,直接完成注册 - 注册完成后,概述页的「应用程序(客户端) ID」就是需要的
AZURE_APP_ID
注意:注册完服务主体必须配置权限:进入目标App Service所在的资源组,打开「访问控制(IAM)」,添加角色分配,角色选择「网站参与者」(遵循最小权限原则,不需要给全局参与者或者管理员权限),成员选择刚才创建的服务主体,保存即可完成授权。
AZURE_PASSWORD
该值绝对不是你个人账号的登录密码,是服务主体的客户端密钥。
获取路径:回到刚才创建的应用注册详情页,进入「证书和密码」菜单,点击「新建客户端密码」,填写备注(比如bitbucket-pipeline-key),按公司安全规则选择过期时间,确认创建。该密钥仅在创建完成时显示一次,关闭页面后无法再次查看,请及时复制保存,这个值就是AZURE_PASSWORD。AZURE_RESOURCE_GROUP
即目标App Service所属的资源组名称,直接在Azure门户「资源组」列表中找到对应资源组,复制名称即可,注意大小写完全匹配。AZURE_APP_NAME
即你已经创建好的Azure App Service的应用名称,就是之前用azurewebapp插件部署时填写的应用名,在App Service列表中直接复制名称即可。
SpringBoot Jar部署注意事项
因为你是打包为独立Jar的SpringBoot应用,不要直接把构建产物上传部署,需要做几个适配:
- 在项目根目录创建
web.config文件,配置Azure平台的Java启动命令,内容参考如下(对应Java 17运行时,其他版本替换路径即可):
<?xml version="1.0" encoding="UTF-8"?> <configuration> <system.webServer> <handlers> <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/> </handlers> <httpPlatform processPath="%JAVA_HOME%\bin\java.exe" arguments="-Djava.net.preferIPv4Stack=true -Dserver.port=%HTTP_PLATFORM_PORT% -jar "%HOME%\site\wwwroot\app.jar""> </httpPlatform> </system.webServer> </configuration>
- 流水线打包Zip时,必须将重命名后的
app.jar和web.config放在Zip包根目录,不要嵌套额外文件夹,否则部署后会找不到启动入口。 - 所有敏感认证变量在Bitbucket仓库配置时,务必勾选「Secure」选项,避免变量值明文出现在流水线日志中造成泄露。
- 提前把Azure App Service的运行时栈设置为对应版本的Java SE,不要选Tomcat等Web容器,避免和内嵌Tomcat的SpringBoot应用冲突。
可直接参考的流水线配置片段:
pipelines: branches: main: - step: name: Build and Deploy to Azure image: maven:3.8.6-openjdk-17 caches: - maven script: - mvn clean package -DskipTests # 整理部署文件到zip根目录 - cp target/*.jar app.jar - zip $ZIP_FILE app.jar web.config # 安装Azure CLI - apt-get update && apt-get install ca-certificates curl apt-transport-https lsb-release gnupg -y - curl -s https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg - echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $(lsb_release -cs) main" > /etc/apt/sources.list.d/azure-cli.list - apt-get update && apt-get install azure-cli -y # 服务主体无交互登录部署 - az login --service-principal -u $AZURE_APP_ID -p $AZURE_PASSWORD --tenant $AZURE_TENANT_ID - az webapp deployment source config-zip --resource-group $AZURE_RESOURCE_GROUP --name $AZURE_APP_NAME --src $ZIP_FILE
内容的提问来源于stack exchange,提问作者Em Ae
相关产品推荐
相关产品推荐

