当前位置: 首页 > news >正文

阿里云效 ,java代码持续化集成部署,亲测有效

我是新建了一个sprong boot项目

我的pom是

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 父 POM --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.18</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!-- 项目信息 --> <groupId>com.example</groupId> <artifactId>lssdemo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Spring Boot Demo Project for ECS deployment</description> <!-- Java 版本(统一为17,和流水线编译版本一致) --> <properties> <java.version>17</java.version> </properties> <!-- 依赖 --> <dependencies> <!-- Web(Spring MVC + 内嵌 Tomcat) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MySQL 驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <scope>runtime</scope> </dependency> <!-- 测试依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!-- 构建插件 --> <build> <plugins> <!-- Spring Boot Maven Plugin(核心修复:添加repackage,生成可执行jar) --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> <!-- 必须添加,重打包为可执行jar --> </goals> </execution> </executions> </plugin> <!-- Maven Compiler Plugin(修复:Java版本和properties一致为17) --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.10.1</version> <configuration> <source>17</source> <!-- 原11,改为和properties一致的17 --> <target>17</target> <!-- 原11,改为和properties一致的17 --> </configuration> </plugin> </plugins> </build> </project>

我的application.yaml是

spring: # 调整默认激活环境为 pre(匹配你的 application-pre.yml) # 保留环境变量占位符,方便后续灵活切换 profiles: active: ${ENV_PROFILES_ACTIVE:pre} jackson: time-zone: Asia/Shanghai logging: level: root: info # 统一日志路径(匹配启动脚本的日志目录) file: path: /home/admin/application/pre/lssdemo/logs # 通用参数(可被 pre 环境覆盖) params: log_path: /home/admin/application/pre/lssdemo/logs/

我的application-pre.yml是

# 服务器端口/访问配置(保持你的原有配置) server: port: 8080 # 需和启动脚本中的 APP_PORT=8080 一致 address: 0.0.0.0 # 允许外网访问,推荐配置 servlet: context-path: /demo # 访问前缀,比如 http://IP:8080/demo/hello # 应用自定义配置(路径匹配启动脚本的 APP_HOME) app: log-dir: /home/admin/application/pre/lssdemo/logs # 和启动脚本日志路径一致 # 可选:覆盖通用日志级别(如需 pre 环境日志更详细) logging: level: root: debug

我的preserverapi1.sh 文件是

#!/bin/bash # =============================== # Spring Boot Demo ECS 启动脚本(修正版) # =============================== # 应用配置 APP_NAME="lssdemo" APP_VERSION="0.0.1-SNAPSHOT" APP_JAR="${APP_NAME}-${APP_VERSION}.jar" # 实际部署路径(根据你的服务器) APP_HOME="/home/admin/application/pre/lssdemo" JAR_PATH="${APP_HOME}/${APP_JAR}" LOG_DIR="${APP_HOME}/logs" LOG_FILE="${LOG_DIR}/start.log" PID_FILE="${APP_HOME}/app.pid" # 应用配置 APP_PORT=8080 JAVA_OPTS="-Xms512m -Xmx1024m -Xss256k -XX:MaxDirectMemorySize=256m" PROG_NAME=$0 ACTION=$1 # 创建日志目录 mkdir -p ${LOG_DIR} usage() { echo "Usage: $PROG_NAME {start|stop|restart|status|check}" echo " start - 启动应用" echo " stop - 停止应用" echo " restart - 重启应用" echo " status - 查看应用状态" echo " check - 健康检查" exit 2 } # 检查应用是否运行 is_running() { if [ -f "$PID_FILE" ]; then PID=$(cat "$PID_FILE") if ps -p $PID > /dev/null 2>&1; then return 0 else rm -f "$PID_FILE" return 1 fi fi # 备用检查:通过进程名查找 PID=$(ps -ef | grep java | grep "${APP_JAR}" | grep -v grep | awk '{print $2}') if [ -n "$PID" ]; then echo $PID > "$PID_FILE" return 0 fi return 1 } start_application() { if is_running; then echo "Application is already running with PID: $(cat $PID_FILE)" return 1 fi # 切换到应用目录 cd ${APP_HOME} # 检查jar包是否存在 if [ ! -f "${JAR_PATH}" ]; then echo "Error: JAR file not found at ${JAR_PATH}" echo "Current directory contents:" ls -la ${APP_HOME} return 1 fi echo "Starting application..." echo "JAR: ${JAR_PATH}" echo "Log: ${LOG_FILE}" # 启动应用 nohup java ${JAVA_OPTS} -jar ${JAR_PATH} --spring.profiles.active=pre > ${LOG_FILE} 2>&1 & PID=$! echo $PID > ${PID_FILE} # 等待应用启动 echo "Waiting for application to start..." sleep 5 # 检查是否启动成功 if is_running; then echo "Application started successfully with PID: $PID" echo "Log file: ${LOG_FILE}" return 0 else echo "Application failed to start. Check log: ${LOG_FILE}" tail -20 ${LOG_FILE} return 1 fi } stop_application() { if ! is_running; then echo "Application is not running" rm -f ${PID_FILE} return 0 fi PID=$(cat ${PID_FILE}) echo "Stopping application with PID: $PID" # 优雅停止 kill $PID # 等待进程结束 local count=0 while [ $count -lt 30 ]; do if ! ps -p $PID > /dev/null 2>&1; then echo "Application stopped successfully" rm -f ${PID_FILE} return 0 fi sleep 1 count=$((count + 1)) done # 强制停止 echo "Force killing application..." kill -9 $PID 2>/dev/null rm -f ${PID_FILE} echo "Application stopped" } status() { if is_running; then PID=$(cat ${PID_FILE}) echo "Application is running" echo " PID: $PID" echo " JAR: ${JAR_PATH}" echo " Port: ${APP_PORT}" # 显示进程信息 echo "" echo "Process info:" ps -ef | grep $PID | grep -v grep # 检查端口 echo "" echo "Port status:" netstat -tlnp 2>/dev/null | grep ${APP_PORT} || ss -tlnp 2>/dev/null | grep ${APP_PORT} else echo "Application is not running" fi } health_check() { if ! is_running; then echo "Health check failed: Application is not running" return 1 fi # 使用curl检查健康状态 local HEALTH_URL="http://127.0.0.1:${APP_PORT}/demo/api/hello" echo "Checking health at ${HEALTH_URL}..." local response=$(curl -s -o /dev/null -w "%{http_code}" ${HEALTH_URL} 2>/dev/null) if [ "$response" = "200" ]; then echo "Health check passed! HTTP $response" return 0 else echo "Health check failed! HTTP $response" echo "Last 10 lines of log:" tail -10 ${LOG_FILE} return 1 fi } case "$ACTION" in start) start_application ;; stop) stop_application ;; restart) stop_application sleep 2 start_application ;; status) status ;; check) health_check ;; *) usage ;; esac

我的目录结构是




target/lssdemo-0.0.1-SNAPSHOT.jar
preserverapi1.sh

也可以是02

lssdemo/target/lssdemo-0.0.1-SNAPSHOT.jar lssdemo/preserverapi1.sh


部署脚本

#!/bin/bash # 1. 创建目标目录 mkdir -p /home/admin/application/pre/lssdemo # 2. 解压产物 cd /home/admin/application/pre tar zxvf /home/admin/app/lssdemo.tgz # 3. 移动文件到正确位置 # 如果存在target目录,移动jar包 if [ -d "target" ]; then echo "移动jar包到lssdemo目录..." cp target/*.jar lssdemo/ rm -rf target fi # 如果存在preserverapi1.sh在pre目录,移动它 if [ -f "preserverapi1.sh" ]; then echo "移动脚本到lssdemo目录..." cp preserverapi1.sh lssdemo/ rm -f preserverapi1.sh fi # 4. 显示最终文件 echo "=== 最终文件 ===" ls -la lssdemo/ # 5. 给脚本赋权 chmod 777 lssdemo/*.sh # 6. 执行重启 cd lssdemo ./preserverapi1.sh restart # 7. 验证进程 echo "部署完成,应用进程:" ps -ef | grep lssdemo | grep -v grep

也可以是02

mkdir -p /home/admin/application tar zxvf /home/admin/app/lssdemo.tgz -C /home/admin/application/pre/ chmod 777 /home/admin/application/pre/lssdemo/preserverapi1.sh /home/admin/application/pre/lssdemo/preserverapi1.sh restart


http://www.jsqmd.com/news/521806/

相关文章:

  • 产品Code查询
  • 6.5.3 软件->W3C HTML5、CSS3标准(W3C Recommendation):Selector网页选择器
  • AxureShare 太慢?用 AxureShow 艾可秀,原型一键秒分享全教程
  • 从分子构象到化学空间探索:CREST工具的完整使用指南
  • LeetCode 位运算高频难题合集|好子数组统计+目标异或最少删除次数
  • NPJ Digit Med 首都医科大学附属北京天坛医院贾旺等团队:基于侵袭性弱监督的MRI影像组学方法用于识别和评估侵袭性垂体神经内分泌肿瘤
  • DNA甲基化测序:全基因组甲基化、简化代表性测序与目标区域捕获的技术选择
  • Linemod算法实战:在ROS+Realsense D435i上实现工业零件的实时抓取定位
  • sigv4pio:面向嵌入式设备的轻量级AWS SigV4签名库
  • GHelper终极指南:华硕ROG笔记本性能优化完全教程
  • 避坑指南:PowerJob连接PostgreSQL时你可能遇到的5个Hibernate配置问题
  • 网传免费TOKEN
  • 别再死记硬背了!用‘指针’和‘文件夹’的比喻,5分钟搞懂BLE GATT里的服务、特征和描述符
  • 2026哪个牌子的防脱精华液能生发?真实测评推荐 - 品牌排行榜
  • 聊聊靠谱的工程用水生植物苗厂家,水藻园园林口碑怎么样? - 工业品网
  • 避开Stateflow仿真那些坑:从汽车速度控制案例看状态迁移与动作执行的正确姿势
  • 关于 liunx 下 IOptionsMonitor 不能即时变化
  • Gemma-3-270m效果实测:多轮问答稳定性、逻辑推理准确性案例分享
  • 永辉超市卡回收攻略:分享实用技巧,让收益最大化 - 团团收购物卡回收
  • 2026年轧辊价格大揭秘,专注轧辊生产的厂家怎么收费 - 工业推荐榜
  • 软件工程师必看:UML类图与对象图的7个常见误区及正确画法
  • PlotNeuralNet实战:优化卷积神经网络结构图绘制体验
  • ComfyUI-WanVideoWrapper架构设计:高性能AI视频生成框架的显存优化与模块化解决方案
  • 保姆级教程:用Wokwi玩转ESP32 MicroPython仿真(含库文件配置指南)
  • Qwen3-ASR-0.6B服务端开发面试宝典:Java八股文与实战结合
  • 2026高纯度视黄醇亚油酸酯生产商推荐及行业洞察 - 品牌排行榜
  • DAMOYOLO-S与经典算法对比:在特定数据集上超越YOLOv5的效果
  • 手把手教你用JSON管理多平台密钥:Hugo部署到Vercel的GitHub Secrets最佳实践
  • 基于Java的万象熔炉·丹青幻境API服务集成实战
  • DAMOYOLO-S在嵌入式边缘计算的应用:基于STM32F103C8T6的轻量级部署方案探索