本文一步一步配图,复制即可跑通;全部搞定后,push 代码 → 自动构建 → 并行部署 → 30 s 回滚,全程零人工。
📊 先看效果(同一条流水线跑 5 个微服务)
| 维度 | 手工部署 | 云效流水线 |
|---|---|---|
| 单次耗时 | 20min | 5min |
| 并行服务 | 1个 | 5个+ |
| 回滚时长 | 10min | 30s |
| 人为故障 | 8% | <0.5% |
🔖 大纲
- 准备工作(账号/主机/路径规划)
- 创建第一条流水线(模板选取→Git 源→触发规则)
- 代码扫描 & JDK/Maven 精准版本
- 智能构建(变更分析 + 多模块并行 install + 产物统一打包)
- 主机组部署(自动注册脚本 + 滚动启停 + JVM 参数调优)
- 回滚策略与在线 Debug
1️⃣ 准备工作
| 事项 | 推荐做法 |
|---|---|
| ① 云效账号 | 阿里云账号直接登录 |
| ② 代码仓库 | CodeUp / GitHub / Gitee 均可 |
| ③ 目标主机 | 阿里云 ECS 或自有主机 |
2️⃣ 流水线创建
进入「云效 → 流水线 → 新建」,根据自己的需求选取合适的部署模块
3️⃣ 码源及触发规则
- 支持 CodeUp / GitHub / Gitee / 自建 GitLab
- 选择触发分支,触发方式
- 开启代码路径过滤(特定路径下代码发生更新触发)
注:我的项目垃圾比较多所以开启了路径过滤,一般根据分支触发就行,下一步构建的时候还会过滤
4️⃣ 代码扫描(可选,有的项目扫描时间久的话不开也行)
- JJDK和Maven 版本选 与项目一致
5️⃣ 智能构建
- 集群和容器选默认的就行
- JJDK和Maven 版本选 与项目一致
- 部署脚本
- 1.定义构建物存放目录,不能默认target目录vn clean会清除target目录
- 2.获取最后一次推送记录
- 3.匹配出需要构建的模块
- 4.定义所有需要构建的服务的目录映射
- 5.循环构建,构建命令根据目录拼接,使用 install + -am 解决依赖
- 6.把所有构建好的JAR包压缩到一起
- 构建物上传
注:如果代码运行有问题的话可以开启Debug模式,直接在线调试看打印运行日志
#!/bin/bash
set -e
# 1. 初始化输出目录 (temp_bundle)
OUTPUT_DIR="temp_bundle"
# 先清理旧数据,保证产物纯净
rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"
这里是拉取最新git推送的信息,根据有变更的文件去匹配需要部署的服务,具体逻辑可以根据自己的需求去写
echo "====== 1. 分析变更文件 ======"
NGED_FILES=$(git show --name-only --pretty="" HEAD)
if [ -z "$CHANGED_FILES" ]; then
echo ">>> 无文件变更"
exit 1 这里1是直接打断后面执行
fi
# 2. 匹配模块
SERVICES=$(echo "$CHANGED_FILES" \
| perl -ne 'print "$1\n" while m!(?:.*/)?(business-[a-z]+|szmsd-auth|szmsd-gateway|szmsd-system)(?:/.*|$)!g' \
| sort -u)
if [ -z "$SERVICES" ]; then
echo ">>> 无目标模块变更,跳过"
exit 1
fi
echo ">>> 待构建服务:$SERVICES"
# 3. 路径映射表
declare -A PATH_MAP=(
[business-bas]="business-center/business-bas"
[business-fss]="business-center/business-fss"
[business-oms]="business-center/business-oms"
[business-excle]="business-center/business-excle"
[business-fms]="business-center/business-fms"
[szmsd-auth]="szmsd-framework/szmsd-auth"
[szmsd-gateway]="szmsd-framework/szmsd-gateway"
[szmsd-system]="szmsd-framework/szmsd-center/szmsd-system"
)
# 4. 循环构建 & 直出结果
for SVC in $SERVICES; do
PROJECT_PATH=${PATH_MAP[$SVC]}
if [ -d "$PROJECT_PATH" ]; then
echo "====== 构建:$SVC ======"
#这里必须使用install + -am去解决微服务几个服务之间的关联
# Maven 构建 (使用 install + -am 解决依赖)
mvn clean install -pl "$PROJECT_PATH" -am -Dmaven.test.skip=true
# 直接拷入最终目录 这里我是使用了自定义目录去存 如果默认target的话下一个mvn clean会清除target目录
cp "${PROJECT_PATH}/target/"*.jar "$OUTPUT_DIR/${SVC}.jar"
else
echo "!!! 错误:路径不存在 $PROJECT_PATH"
fi
done
# 5. 结果验证
if [ "$(ls -A $OUTPUT_DIR)" ]; then
echo "====== 构建成功 ======"
echo "产物目录:$OUTPUT_DIR/"
ls -lh "$OUTPUT_DIR"/*.jar
else
echo "错误:未生成任何 Jar 包"
exit 1
fi
6️⃣ 主机部署
- 选择上一步上传的制品
- 添加主机
- 1.流水线 → 主机组 → 新建 → 复制 一键安装命令
- 2.到服务器执行,5 s 即可看到“在线”
- 下载制品到服务器指定路径(一般放到服务器存放JAR包的地方)
- 部署脚本
- 1.进入存放JAR包的目录
- 2.解压制品
- 3.循环部署服务。(查找进程id---杀进程---覆盖JAR包---启动服务)
- 清除下载的制品包
#!/bin/bash
ROOT="/u01/www/fms-adl"
OPTS="-Xms256m -Xmx512m"
cd "$ROOT" || exit 1
# 1. 解压
if [ -f package.tgz ]; then
tar -zxf package.tgz
else
exit 1
fi
# 2. 循环部署
for jar in *.jar; do
[ -e "$jar" ] || continue
NAME=${jar%.jar}
DIR="$ROOT/$NAME"
echo ">>> 部署: $NAME"
mkdir -p "$DIR"
# 杀进程
PID=$(ps -ef | grep "$NAME" | grep java | grep -v grep | awk '{print $2}')
[ -n "$PID" ] && kill -9 $PID
# 覆盖
mv -f "$jar" "$DIR/"
cd "$DIR"
# 启动 (注意:$OPTS 不要加引号,否则Java会无法识别多个参数)
# 2>&1 确保错误日志也被静默处理
nohup java $OPTS -jar "$jar" --spring.profiles.active=dev > /dev/null 2>&1 &
cd "$ROOT"
done
# 3. 清理
rm -f package.tgz
echo "=== 完成 ==="
最终效果
构建日志
一键回滚
还可以自己加功能,如审批,群机器人通知之类的
- 如果本文帮到你,欢迎 点赞 + 收藏 + 评论」 ❤️
- 另外主页还有前端部署教程欢迎学习❤️