无jenkins部署java项目 📅 发布时间:2026/7/14 8:53:40 👁️ 浏览次数: 1、必要软件GitMavenJdk2、部署脚本#!/bin/bash # 设置颜色输出 RED\033[0;31m GREEN\033[0;32m YELLOW\033[1;33m NC\033[0m # No Color # 配置信息 GIT_REPO_URL你的Git仓库地址 # 请修改为你的Git仓库地址 PROJECT_DIR/opt/project # 项目存放目录 JAR_DIR/opt/jar # JAR文件存放目录 JAR_NAMEyour-app.jar # JAR文件名请修改 PROJECT_MODULE # 如果是多模块项目指定模块名如module-name/target SPRING_PROFILEprod # Spring Boot 配置文件 # 打印带颜色的信息 print_info() { echo -e ${GREEN}[INFO]${NC} $1 } print_error() { echo -e ${RED}[ERROR]${NC} $1 } print_warn() { echo -e ${YELLOW}[WARN]${NC} $1 } # 检查命令执行结果 check_result() { if [ $? -ne 0 ]; then print_error $1 exit 1 fi } # 第一步拉取代码并打包 deploy_project() { print_info 开始部署项目... # 创建必要的目录 mkdir -p $PROJECT_DIR mkdir -p $JAR_DIR # 进入项目目录 cd $PROJECT_DIR # 检查是否已存在git仓库 if [ -d .git ]; then print_info 更新代码... git pull else print_info 克隆代码... git clone $GIT_REPO_URL . fi check_result 代码拉取失败 # Maven打包 print_info 开始Maven打包... # 检查maven命令 if ! command -v mvn /dev/null; then print_error Maven未安装请先安装Maven exit 1 fi # 执行打包命令跳过测试 mvn clean package -DskipTests check_result Maven打包失败 # 查找生成的JAR文件 print_info 查找生成的JAR文件... # 确定JAR文件路径 if [ -n $PROJECT_MODULE ]; then JAR_PATH$PROJECT_DIR/$PROJECT_MODULE/target/*.jar else JAR_PATH$PROJECT_DIR/target/*.jar fi # 复制最新的JAR文件到目标目录 print_info 复制JAR文件到 $JAR_DIR ... cp $JAR_PATH $JAR_DIR/$JAR_NAME 2/dev/null # 如果上面的命令失败尝试查找其他位置的JAR if [ $? -ne 0 ]; then # 查找最近生成的JAR文件 LATEST_JAR$(find $PROJECT_DIR -name *.jar -type f -printf %T %p\n | sort -n | tail -1 | cut -f2- -d ) if [ -n $LATEST_JAR ]; then cp $LATEST_JAR $JAR_DIR/$JAR_NAME print_info 找到并复制JAR: $LATEST_JAR else print_error 未找到生成的JAR文件 exit 1 fi fi check_result 复制JAR文件失败 print_info 部署完成JAR文件已保存到: $JAR_DIR/$JAR_NAME } # 第二步启动JAR项目使用prod配置 start_project() { print_info 开始启动项目使用配置文件: $SPRING_PROFILE cd $JAR_DIR # 检查JAR文件是否存在 if [ ! -f $JAR_DIR/$JAR_NAME ]; then print_error JAR文件不存在: $JAR_DIR/$JAR_NAME exit 1 fi # 检查Java环境 if ! command -v java /dev/null; then print_error Java未安装请先安装Java exit 1 fi # 检查是否已经在运行 if [ -f app.pid ]; then OLD_PID$(cat app.pid) if ps -p $OLD_PID /dev/null 21; then print_warn 应用已在运行PID: $OLD_PID print_info 是否重启(y/n): read -r RESTART if [ $RESTART y ] || [ $RESTART Y ]; then print_info 停止旧进程... kill $OLD_PID sleep 3 else exit 0 fi fi fi # 启动JAR包 - 使用prod配置 print_info 启动JAR文件使用 $SPRING_PROFILE 配置... # Java启动参数可根据需要修改 JAVA_OPTS-Xms512m -Xmx1024m -XX:UseG1GC # 方式1使用application-prod.properties/yml # 启动命令后台运行- 通过命令行参数指定profile nohup java $JAVA_OPTS -jar $JAR_NAME --spring.profiles.active$SPRING_PROFILE app.log 21 # 方式2也可以使用环境变量两种方式任选一种 # nohup java $JAVA_OPTS -jar -Dspring.profiles.active$SPRING_PROFILE $JAR_NAME app.log 21 # 保存PID echo $! app.pid # 等待几秒检查是否启动成功 sleep 8 # 检查进程是否存在 if ps -p $(cat app.pid) /dev/null 21; then print_info 应用启动成功 print_info PID: $(cat app.pid) print_info 配置文件: $SPRING_PROFILE print_info 日志文件: $JAR_DIR/app.log # 显示启动日志的最后几行并过滤出profile相关信息 print_info 最近日志包含profile信息: grep -E profile|active|$SPRING_PROFILE app.log | tail -5 # 显示完整的最后5行日志 print_info 最后5行日志: tail -5 app.log else print_error 应用启动失败请检查日志 tail -20 app.log exit 1 fi } # 停止项目 stop_project() { if [ -f $JAR_DIR/app.pid ]; then PID$(cat $JAR_DIR/app.pid) print_info 正在停止应用PID: $PID kill $PID rm $JAR_DIR/app.pid print_info 应用已停止 else print_warn 没有找到PID文件 fi } # 查看状态 status_project() { if [ -f $JAR_DIR/app.pid ]; then PID$(cat $JAR_DIR/app.pid) if ps -p $PID /dev/null 21; then print_info 应用正在运行PID: $PID print_info 配置文件: $SPRING_PROFILE print_info 进程信息: ps -f -p $PID # 显示应用的启动参数确认profile print_info 启动参数中的profile: ps -p $PID -o args | grep -o \--spring.profiles.active[ ][^ ]* || echo 未找到profile参数 else print_warn PID文件存在但进程不存在可能异常退出 fi else print_warn 应用未运行 fi } # 查看日志 logs_project() { if [ -f $JAR_DIR/app.log ]; then tail -f $JAR_DIR/app.log else print_error 日志文件不存在 fi } # 使用不同的配置文件启动 start_with_profile() { PROFILE$1 if [ -z $PROFILE ]; then PROFILE$SPRING_PROFILE fi print_info 使用配置文件 $PROFILE 启动... cd $JAR_DIR if [ ! -f $JAR_DIR/$JAR_NAME ]; then print_error JAR文件不存在: $JAR_DIR/$JAR_NAME exit 1 fi # 停止旧进程 if [ -f app.pid ]; then kill $(cat app.pid) 2/dev/null sleep 3 fi # 启动新进程 nohup java -jar $JAR_NAME --spring.profiles.active$PROFILE app.log 21 echo $! app.pid print_info 应用已启动PID: $(cat app.pid)配置文件: $PROFILE } # 主函数 main() { case $1 in start) deploy_project start_project ;; stop) stop_project ;; restart) stop_project sleep 2 deploy_project start_project ;; status) status_project ;; logs) logs_project ;; deploy-only) deploy_project ;; start-only) start_project ;; start-prod) # 直接启动生产环境不重新部署 SPRING_PROFILEprod start_project ;; start-dev) # 使用开发环境配置启动 start_with_profile dev ;; start-test) # 使用测试环境配置启动 start_with_profile test ;; *) echo 使用方法: $0 {start|stop|restart|status|logs|deploy-only|start-only|start-prod|start-dev|start-test} echo start - 完整部署并使用 prod 配置启动 echo stop - 停止应用 echo restart - 重启应用 echo status - 查看应用状态 echo logs - 查看实时日志 echo deploy-only - 只部署拉取代码打包 echo start-only - 只启动使用现有JARprod配置 echo start-prod - 直接启动prod配置不重新部署 echo start-dev - 直接启动dev配置不重新部署 echo start-test - 直接启动test配置不重新部署 exit 1 ;; esac } # 执行主函数 main $3、使用方法修改配置将GIT_REPO_URL改为你的Git仓库地址根据需要修改JAR_NAME如果是多模块项目设置PROJECT_MODULESPRING_PROFILE是配置环境application-prod.yml生产环境prodapplication-dev.yml开发环境devapplication-test.yml测试环境testapplication.yml通用配置使用# 完整部署并启动 ./start.sh start # 只部署拉取代码打包 ./start.sh deploy-only # 只启动使用现有JAR ./start.sh start-only # 停止应用 ./start.sh stop # 重启应用 ./start.sh restart # 查看状态 ./start.sh status # 直接启动prod配置不重新部署 ./start.sh start-prod # 启动其他环境的配置 ./start.sh start-dev ./start.sh start-test # 查看应用状态确认使用的配置 ./start.sh status查看日志tail -f /opt/jar/app.log
GLM-OCR搭建个人知识库:自动解析并索引本地所有文档资料 GLM-OCR搭建个人知识库:自动解析并索引本地所有文档资料 你是不是也遇到过这种情况:电脑里存了上千份PDF论文、扫描的书籍、会议笔记,甚至还有一堆名片照片。当你想找某个特定概念、某位专家的联系方式,或者某篇论文里的关键结论… 2026/7/13 19:03:44
MogFace-large项目实战:从零构建一个人脸考勤系统 MogFace-large项目实战:从零构建一个人脸考勤系统 考勤,大概是每个公司行政和IT部门都绕不开的话题。传统的打卡方式,无论是刷卡、指纹还是密码,总有些绕不过去的小麻烦:忘带卡、指纹识别不灵、密码泄露或者干脆让人代… 2026/7/13 4:04:58
BGE-Reranker-v2-m3镜像使用指南:test.py与test2.py详解 BGE-Reranker-v2-m3镜像使用指南:test.py与test2.py详解 1. 环境准备与快速启动 BGE-Reranker-v2-m3镜像已经预装了完整的运行环境和模型权重,无需额外配置。这个镜像基于智源研究院开发的高性能重排序模型,专门用于提升RAG系统的检索精度。… 2026/7/12 14:11:46
Pandas多维聚合实战:业务分析的高效数据处理方法论 1. 项目概述:为什么“多维聚合”不是Pandas进阶技巧,而是业务分析的生存技能我在银行风控部门干了七年,从刚毕业写SQL查数的分析师,到带三个人小团队做反欺诈模型的数据架构师。这七年里,我亲手重构过四套核心报表系统… 2026/7/14 8:48:14
C++并行计算实战:std::async、OpenMP与TBB性能对比与选型指南 1. 项目概述:为何要对比C并行三巨头? 在C高性能计算的世界里,性能就是硬通货。无论是处理海量数据的科学计算,还是追求极致帧率的游戏引擎,抑或是需要实时响应的金融交易系统,并行计算都是绕不开的核心技术… 2026/7/14 8:48:14
Nemotron-Labs-Diffusion-3B-4bit训练与微调指南:LoRA适配器的配置与使用 Nemotron-Labs-Diffusion-3B-4bit训练与微调指南:LoRA适配器的配置与使用 【免费下载链接】Nemotron-Labs-Diffusion-3B-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Nemotron-Labs-Diffusion-3B-4bit 想要快速掌握Nemotron-Labs-Diff… 2026/7/14 8:46:13
ROS 2工业落地实战:DDS通信、分层架构与等保安全设计 1. 项目概述:这不是一个“ROS 2教程”,而是一次真实工程现场的复盘 “ The ROS 2 Project ”——这个看似平淡无奇的标题,背后藏着的是过去18个月里我带团队交付的3个工业级机器人系统的核心技术基座。它不是实验室里的Demo,不是… 2026/7/14 8:46:13
Phrase在大型Android项目中的应用案例:Square实践经验分享 Phrase在大型Android项目中的应用案例:Square实践经验分享 【免费下载链接】phrase Phrase is an Android string resource templating library 项目地址: https://gitcode.com/gh_mirrors/ph/phrase 想要在大型Android项目中高效管理字符串资源吗࿱… 2026/7/14 8:46:13
CPM4OSSP-PROXY核心功能解析:软件包依赖管理的终极指南 CPM4OSSP-PROXY核心功能解析:软件包依赖管理的终极指南 【免费下载链接】CPM4OSSP-PROXY The proxy of centralized management platform for operating system software package 项目地址: https://gitcode.com/openeuler/CPM4OSSP-PROXY 前往项目官网免费下… 2026/7/14 8:44:12
XUnity.AutoTranslator 游戏实时翻译插件:从原理到实战的完整指南 1. 项目概述:当游戏语言成为一堵墙作为一名玩了十几年日系、欧美独立游戏的“老油条”,我太懂那种面对一款心仪已久、画风玩法都戳中G点的游戏,却因为语言不通而望而却步的痛了。尤其是那些基于Unity引擎开发的、体量不大但内容精良的作品&am… 2026/7/14 0:05:14
2026普通文员学数据分析的价值 一、2026年普通文员学习数据分析的必要性随着数字化转型加速,数据分析技能正逐渐成为职场基础能力。普通文员学习数据分析可以提升工作效率、增强竞争力,并为职业转型提供更多可能性。二、数据分析对文员的价值自动化办公:通过数据分析工具&a… 2026/7/14 0:05:14
2026从计划员到主管,生产管理者学数据分析有用吗? 一、生产管理领域的职业发展路径 从计划员到主管的角色转变,是生产管理者职业发展的典型路径。计划员主要负责生产排程、库存管理和资源协调等基础工作,而主管则需要承担团队管理、决策支持和效率优化等更高级别的职责。这种转变不仅仅是职位的提升&… 2026/7/14 0:05:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/13 9:31:08
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41