name: Java Maven 3.9.9 & JDK 26 CI/CD Pipeline on: push: branches: - dev # 只有推送到 main 分支时才触发自动部署 env: IMAGE_NAME: trace-img CONTAINER_NAME: trace-container APP_PORT: 8080 jobs: build-and-deploy: # 调度我们在之前的 runner 中注册的宿主机 Docker 环境 runs-on: centos-env steps: - name: 1. 拉取最新的仓库代码 uses: actions/checkout@v4 - name: 2. 触发 Docker 容器内编译与镜像打包 run: | echo "🚀 开始构建 JDK 26 镜像: ${IMAGE_NAME}:${{ gitea.sha }}" docker build -t ${IMAGE_NAME}:${{ gitea.sha }} . docker tag ${IMAGE_NAME}:${{ gitea.sha }} ${IMAGE_NAME}:latest - name: 3. 旧容器清理与新容器平滑重启 run: | echo "🧹 正在清理旧版本的容器..." docker stop ${CONTAINER_NAME} || true docker rm ${CONTAINER_NAME} || true echo "🔄 正在启动全新 JDK 26 容器环境..." docker run -d \ --name ${CONTAINER_NAME} \ -p ${APP_PORT}:${APP_PORT} \ --restart no \ -m 512m \ -e JAVA_TOOL_OPTIONS="-Xms128m -Xmx384m -XX:+UseG1GC" \ ${IMAGE_NAME}:latest - name: 4. 服务健康检查 (HTTP 探活) run: | echo "🔍 开始对端口 ${APP_PORT} 进行健康状态探活..." # 循环探活:每隔 5 秒检测一次,最多尝试 15 次(总计 75 秒,给高版本 JVM 充足的预热时间) for i in {1..15}; do # 发送轻量级请求,只要服务响应了(无论是200还是Spring默认的404/无路由),都证明 Tomcat/Netty 已拉起 if curl -s -f http://localhost:${APP_PORT}/hello > /dev/null; then echo "✅ [SUCCESS] 探活成功!Java 26 服务已成功拉起,并开始提供服务。" exit 0 fi echo "⏳ [WAITING] 服务仍在启动中,等待 5 秒后重试 ($i/15)..." sleep 5 done echo "❌ [ERROR] 探活失败!服务在 75 秒内未能建立连接,可能发生了启动闪退。" echo "===== 以下为容器崩溃前的实时日志 =====" docker logs ${CONTAINER_NAME} exit 1