🚀 10 分钟搭出“企业级”Java 微服务 CI/CD——云效 + 自有主机并行部署 10+ 服务,效率提升 300%

60 阅读4分钟

本文一步一步配图,复制即可跑通;全部搞定后,push 代码 → 自动构建 → 并行部署 → 30 s 回滚,全程零人工。

📊 先看效果(同一条流水线跑 5 个微服务)

维度手工部署云效流水线
单次耗时20min5min
并行服务1个5个+
回滚时长10min30s
人为故障8%<0.5%

🔖 大纲

  1. 准备工作(账号/主机/路径规划)
  2. 创建第一条流水线(模板选取→Git 源→触发规则)
  3. 代码扫描 & JDK/Maven 精准版本
  4. 智能构建(变更分析 + 多模块并行 install + 产物统一打包)
  5. 主机组部署(自动注册脚本 + 滚动启停 + JVM 参数调优)
  6. 回滚策略与在线 Debug

1️⃣ 准备工作

事项推荐做法
① 云效账号阿里云账号直接登录
② 代码仓库CodeUp / GitHub / Gitee 均可
③ 目标主机阿里云 ECS 或自有主机

2️⃣ 流水线创建

进入「云效 → 流水线 → 新建」,根据自己的需求选取合适的部署模块

image.png

3️⃣ 码源及触发规则

  • 支持 CodeUp / GitHub / Gitee / 自建 GitLab
  • 选择触发分支,触发方式
  • 开启代码路径过滤(特定路径下代码发生更新触发)

注:我的项目垃圾比较多所以开启了路径过滤,一般根据分支触发就行,下一步构建的时候还会过滤

image.png

image.png

4️⃣ 代码扫描(可选,有的项目扫描时间久的话不开也行)

  • JJDK和Maven 版本选 与项目一致

image.png

5️⃣ 智能构建

  • 集群和容器选默认的就行
  • JJDK和Maven 版本选 与项目一致
  • 部署脚本
  • 1.定义构建物存放目录,不能默认target目录vn clean会清除target目录
  • 2.获取最后一次推送记录
  • 3.匹配出需要构建的模块
  • 4.定义所有需要构建的服务的目录映射
  • 5.循环构建,构建命令根据目录拼接,使用 install + -am 解决依赖
  • 6.把所有构建好的JAR包压缩到一起
  • 构建物上传

注:如果代码运行有问题的话可以开启Debug模式,直接在线调试看打印运行日志

image.png image.png

#!/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

image.png

6️⃣ 主机部署

  • 选择上一步上传的制品
  • 添加主机
  • 1.流水线 → 主机组 → 新建 → 复制 一键安装命令
  • 2.到服务器执行,5 s 即可看到“在线”
  • 下载制品到服务器指定路径(一般放到服务器存放JAR包的地方)
  • 部署脚本
  • 1.进入存放JAR包的目录
  • 2.解压制品
  • 3.循环部署服务。(查找进程id---杀进程---覆盖JAR包---启动服务)
  • 清除下载的制品包

image.png

image.png

image.png

image.png

#!/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 "=== 完成 ==="

最终效果

image.png

构建日志

image.png

一键回滚

image.png

还可以自己加功能,如审批,群机器人通知之类的

image.png

image.png

  • 如果本文帮到你,欢迎 点赞 + 收藏 + 评论」 ❤️
  • 另外主页还有前端部署教程欢迎学习❤️