如何通过Bitbucket将WAR包自动部署至AWS Ubuntu实例的Tomcat
可行的Bitbucket到AWS Tomcat自动部署方案
我之前帮几个同事搞定过一模一样的场景,给你一套亲测能跑通的步骤,跟着来应该没问题:
一、先搞定AWS Ubuntu实例的准备工作
1. 配置SSH密钥让Bitbucket能访问实例
- 在你的AWS实例上生成SSH密钥对(权限一定要配置对,不然连不上):
一路回车用默认设置,会得到ssh-keygen -t ed25519 -C "bitbucket-deploy"id_ed25519(私钥)和id_ed25519.pub(公钥)两个文件。 - 把公钥内容添加到实例的授权列表里:
cat id_ed25519.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh - 把私钥内容复制下来,后面要用到Bitbucket的配置里。
2. 编写部署脚本
在AWS实例上创建一个部署脚本,比如/home/ubuntu/deploy-war.sh,内容根据你的实际路径调整:
#!/bin/bash # 替换成你Tomcat的webapps实际路径 TOMCAT_WEBAPPS="/home/ubuntu/tomcat/webapps" # 替换成你的项目WAR包名称 WAR_NAME="my-webapp.war" # 可选:如果需要避免部署冲突,可以先停Tomcat # sudo systemctl stop tomcat # 删除旧的WAR包和解压后的目录 rm -rf $TOMCAT_WEBAPPS/$WAR_NAME rm -rf $TOMCAT_WEBAPPS/${WAR_NAME%.war} # 把新传过来的WAR包移到webapps目录 mv /tmp/$WAR_NAME $TOMCAT_WEBAPPS/ # 可选:重启Tomcat(如果之前停了的话) # sudo systemctl start tomcat # 给WAR包设置正确权限,防止Tomcat读取失败 chown ubuntu:ubuntu $TOMCAT_WEBAPPS/$WAR_NAME
然后给脚本加上执行权限:
chmod +x /home/ubuntu/deploy-war.sh
二、配置Bitbucket Pipeline
1. 启用Pipeline并添加SSH密钥
- 打开你的Bitbucket仓库,进入Settings > Pipelines > SSH keys,点击Add key,把之前复制的私钥内容粘贴进去,同时填写你的AWS实例地址,格式是
ubuntu@你的实例公网IP。
2. 创建Pipeline配置文件
在你的Java项目根目录创建bitbucket-pipelines.yml文件,内容如下:
# 换成你项目对应的Java版本Maven镜像 image: maven:3.8.6-openjdk-11 pipelines: default: - step: name: 构建并自动部署WAR包 deployment: production # 可选,标记部署环境 script: # 用Maven构建WAR包(Gradle项目换成gradle build即可) - mvn clean package -DskipTests # 把构建好的WAR包传到AWS实例临时目录 - scp target/$WAR_NAME ubuntu@你的实例公网IP:/tmp/ # 执行实例上的部署脚本 - ssh ubuntu@你的实例公网IP "/home/ubuntu/deploy-war.sh" artifacts: - target/*.war # 可选,保存构建产物方便回溯
记得把$WAR_NAME和实例IP替换成你自己的实际信息。
三、测试部署
- 把
bitbucket-pipelines.yml提交推送到Bitbucket仓库,随便改一行代码再推送,触发自动Pipeline。 - 去Bitbucket的Pipelines页面看执行日志,如果没有报错,就去Tomcat的webapps目录检查新WAR包是否已经被解压,再访问应用地址验证部署效果。
避坑提醒
- 确保AWS实例的安全组开放了22端口(SSH),不然Bitbucket连不上你的实例。
- Tomcat默认开启自动部署,如果没生效,检查
conf/server.xml里的Host节点是否有autoDeploy="true"配置。 - 如果Maven构建需要私有依赖,记得在Bitbucket Pipeline里配置对应的Maven settings(可以用加密文件或者环境变量)。
- 脚本里的路径一定要和你实际的Tomcat路径完全匹配,别写错了!
内容的提问来源于stack exchange,提问作者Gadreel
相关产品推荐
相关产品推荐

