Centos7拉取编译运行SpringBoot【自动化部署脚本】

Centos7拉取编译运行SpringBoot

根据您的需求,这里是为脚本添加了自定义工具路径的改进版本,包含路径检查和环境变量设置:

#!/bin/bash

# 配置区(根据实际情况修改)
REPO_URL="https://github.com/yourusername/your-springboot-repo.git"  # 项目仓库地址
BRANCH="master"                        # 要拉取的分支
PROJECT_DIR="/opt/springboot-app"      # 项目部署目录
JAVA_OPTS="-Xmx512m -Xms256m"          # JVM参数

# 自定义工具路径(如果为空则自动检测安装)
JAVA_HOME="/opt/module/jdk1.8.0_371" # 示例:"/usr/lib/jvm/java-1.8.0-openjdk"
GIT_PATH="/usr/bin/git"              # 示例:"/usr/bin/git"
MAVEN_HOME="/opt/module/maven-3.9.4" # 示例:"/usr/share/maven"

# 安装必要依赖
install_dependencies() {
    echo "▂▂▂▂▂▂▂▂▂▂▂▂▂▂ 依赖检查 ▂▂▂▂▂▂▂▂▂▂▂▂▂▂"
    
    # 统一安装函数
    install_package() {
        echo "正在安装 $1..."
        if ! sudo yum install -y "$1"; then
            echo "错误:$1 安装失败!"
            exit 1
        fi
        echo "$1 安装成功 ✔"
    }

    # Java环境设置
    echo ">>> 检查Java环境"
    if [[ -n "$JAVA_HOME" ]]; then
        if [[ ! -x "$JAVA_HOME/bin/java" ]]; then
            echo "错误:JAVA_HOME无效,找不到可执行文件 $JAVA_HOME/bin/java"
            exit 1
        fi
        echo "使用自定义Java路径:$JAVA_HOME"
    else
        if ! command -v java &>/dev/null; then
            install_package "java-1.8.0-openjdk-devel"
        fi
        # 精确获取JAVA_HOME
        JAVA_HOME=$(java -XshowSettings:properties -version 2>&1 | grep 'java\.home' | awk '{print $3}')
        [[ -z "$JAVA_HOME" ]] && {
            echo "错误:自动获取JAVA_HOME失败!"
            exit 1
        }
        echo "自动检测到JAVA_HOME:$JAVA_HOME"
    fi
    export JAVA_HOME
    export PATH="$JAVA_HOME/bin:$PATH"
    echo "Java版本:$(java -version 2>&1 | head -n 1)"

    # Git环境设置
    echo ">>> 检查Git环境"
    if [[ -n "$GIT_PATH" ]]; then
        if [[ ! -x "$GIT_PATH" ]]; then
            echo "错误:Git路径无效:$GIT_PATH"
            exit 1
        fi
        export PATH="$(dirname "$GIT_PATH"):$PATH"
        echo "使用自定义Git路径:$GIT_PATH"
    else
        if ! command -v git &>/dev/null; then
            install_package "git"
        fi
        GIT_PATH=$(command -v git)
        echo "自动检测到Git路径:$GIT_PATH"
    fi
    echo "Git版本:$(git --version)"

    # Maven环境设置
    echo ">>> 检查Maven环境"
    if [[ -n "$MAVEN_HOME" ]]; then
        if [[ ! -x "$MAVEN_HOME/bin/mvn" ]]; then
            echo "错误:MAVEN_HOME无效,找不到可执行文件 $MAVEN_HOME/bin/mvn"
            exit 1
        fi
        echo "使用自定义Maven路径:$MAVEN_HOME"
    else
        if ! command -v mvn &>/dev/null; then
            install_package "maven"
        fi
        # 精确获取MAVEN_HOME
        MAVEN_HOME=$(mvn -v 2>/dev/null | grep 'Maven home' | awk '{print $3}')
        [[ -z "$MAVEN_HOME" ]] && MAVEN_HOME=$(dirname "$(dirname "$(readlink -f "$(command -v mvn)")")")
        [[ -z "$MAVEN_HOME" ]] && {
            echo "错误:自动获取MAVEN_HOME失败!"
            exit 1
        }
        echo "自动检测到MAVEN_HOME:$MAVEN_HOME"
    fi
    export MAVEN_HOME
    export PATH="$MAVEN_HOME/bin:$PATH"
    echo "Maven版本:$(mvn --version | head -n 1)"

    echo "▄▄▄▄▄▄▄▄▄▄▄▄▄▄ 依赖就绪 ▄▄▄▄▄▄▄▄▄▄▄▄▄▄"
}

# 拉取/更新代码
clone_or_update() {
    # 进入目录或克隆仓库
    if [ -d "$PROJECT_DIR/.git" ]; then
        echo "更新仓库代码..."
        cd "$PROJECT_DIR" || { echo "进入项目目录失败!"; exit 1; }
        
        # 清理工作区修改
        git reset --hard HEAD || { echo "重置工作区失败!"; exit 1; }
        git clean -fd || { echo "清理未跟踪文件失败!"; exit 1; }

        # 切换分支(强制与远程分支同步)
        git checkout -B "$BRANCH" "origin/$BRANCH" || { echo "切换分支失败!"; exit 1; }
        
        # 拉取最新代码(使用 rebase 模式)
        git pull --rebase origin "$BRANCH" || { echo "拉取代码失败!"; exit 1; }
    else
        echo "初次克隆仓库..."
        rm -rf "$PROJECT_DIR"
        git clone -b "$BRANCH" "$REPO_URL" "$PROJECT_DIR" || { 
            echo "克隆仓库失败!";
            exit 1;
        }
    fi
}

# 构建项目
build_project() {
    echo "开始编译打包..."
    cd "$PROJECT_DIR" || { echo "进入项目根目录失败!"; exit 1; }

    # 全量构建(推荐)或指定模块构建
    # 方式1:构建整个项目(适合需要安装依赖到本地仓库的场景)
    mvn clean package -DskipTests
    
    # 验证构建结果(这样子写不好,我想以PROJECT_DIR为根路径,指定jar包的相对路径)
    # 定位生成的JAR文件(根据实际pom.xml配置调整匹配模式)
#JAR_PATH=$(find "$PROJECT_DIR" \      # 在项目目录下递归搜索
#    -path "*/target/*.jar" \          # 匹配所有target目录下的.jar文件
#    -not -name "*-sources.jar" \      # 排除源码包(通常包含-sources后缀)
#    -print | \                       # 打印匹配结果
#    grep -v '/test-' | \             # 过滤掉包含/test-的路径(排除测试包)
#    head -n 1)                       # 取第一个匹配结果(假设只有一个主JAR)

# 各部分功能详解:
# 1. find "$PROJECT_DIR"            : 从项目根目录开始递归搜索
# 2. -path "*/target/*.jar"        : 匹配所有Maven标准输出目录中的JAR文件
#    - 示例路径:/project/moduleA/target/app.jar
# 3. -not -name "*-sources.jar"    : 排除Maven生成的源码包
# 4. grep -v '/test-'              : 过滤掉测试模块的JAR(路径含/test-)
# 5. head -n 1                     : 取第一个结果,适用于单模块项目

    # 如果是多模块项目,建议指定具体子模块路径
    JAR_PATH="/opt/module/XXXXX.jar"
    if [ -z "$JAR_PATH" ]; then
        echo "错误:未找到生成的JAR文件!"
        exit 1
    fi
    echo "检测到构建产物:$JAR_PATH"
}

# 停止旧进程
stop_previous() {
    PID_FILE="$PROJECT_DIR/app.pid"
    if [ -f $PID_FILE ]; then
        OLD_PID=$(cat $PID_FILE)
        if ps -p $OLD_PID > /dev/null; then
            echo "停止正在运行的进程 (PID: $OLD_PID)..."
            kill $OLD_PID
            sleep 5
        else
            echo "发现旧PID文件但进程不存在,清理中..."
        fi
        rm -f $PID_FILE
    fi
}

# 启动应用
start_application() {
    echo "启动Spring Boot应用..."
    cd "$PROJECT_DIR"
    nohup java $JAVA_OPTS -jar $JAR_PATH > application.log 2>&1 &
    NEW_PID=$!
    echo $NEW_PID > app.pid
    echo "应用已启动,PID: $NEW_PID"
    echo "日志文件:$PROJECT_DIR/application.log"
}

# 主流程
main() {
    set -e
    install_dependencies
    clone_or_update
    build_project
    stop_previous
    start_application
}

# 执行入口
main

更新说明:

  1. 路径配置灵活性
    • 新增JAVA_HOMEGIT_PATHMAVEN_HOME三个可配置路径
    • 用户可指定自定义安装路径,留空则自动检测系统路径
    • 路径检查包含有效性验证(存在性、可执行性)

  2. 智能路径处理

    # Java路径处理逻辑示例:
    if [[ -n "$JAVA_HOME" ]]; then
        # 验证自定义路径有效性
        export PATH="$JAVA_HOME/bin:$PATH"
    else
        # 自动安装并获取系统安装路径
        JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
    fi
    
  3. 增强环境验证
    • 安装完成后显示各工具版本信息
    • 严格校验路径有效性,避免错误配置导致后续失败

  4. 路径优先级规则

    自定义路径 → 系统环境路径 → 自动安装路径
    

使用建议:

  1. 自定义路径使用场景

    # 示例:使用手动安装的JDK 11
    JAVA_HOME="/usr/java/jdk-11.0.15"
    
    # 示例:使用编译安装的最新版Git
    GIT_PATH="/usr/local/git/bin/git"
    
    # 示例:使用手动安装的Maven
    MAVEN_HOME="/opt/maven/apache-maven-3.8.6"
    
  2. 生产环境推荐配置
    • 建议显式指定路径以确保版本一致性
    • 关闭自动安装功能(删除else中的安装逻辑)
    • 添加更严格的版本检查

  3. 路径检测原理

    # Java路径检测流程:
    which java → /usr/bin/java
    readlink -f → /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b09-2.el7_9.x86_64/jre/bin/java
    dirname ×2 → /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b09-2.el7_9.x86_64
    

注意事项:

  1. 自定义路径需要:
    • 确保执行权限(chmod +x /path/to/binary
    • 配置正确的用户权限(避免权限不足)

  2. 如果使用非yum安装的组件:
    • 需要自行处理更新和维护
    • 建议在脚本中添加版本验证逻辑

  3. 生产环境建议:

    # 在main()开始处添加:
    set -o errexit   # 遇到错误立即退出
    set -o nounset   # 使用未定义变量时报错
    set -o pipefail  # 管道命令中任意失败则整体失败
    

如果需要更严格的版本控制或离线安装支持,可以进一步扩展路径处理逻辑。

认证方式配置说明

方式一:SSH公钥认证(推荐)
  1. 生成密钥对

    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
    # 保存路径保持默认(~/.ssh/id_rsa)
    
  2. 添加公钥到Git仓库

    • 查看公钥:cat ~/.ssh/id_rsa.pub
    • 添加公钥到 GitHub 或 GitLab
      • GitHub:登录 GitHub 账号,点击右上角头像,选择 “Settings”,接着在左侧菜单中选择 “SSH and GPG keys”,然后点击 “New SSH key”,将上一步查看到的公钥内容复制到 “Key” 输入框中,最后点击 “Add SSH key” 完成添加。
      • GitLab:登录 GitLab 账号,点击右上角头像,选择 “Edit profile”,在左侧菜单中选择 “SSH Keys”,将公钥内容粘贴到 “Key” 输入框,设置好 “Title” 和 “Expires at” 后,点击 “Add key” 完成添加。
  3. 脚本配置

    GIT_AUTH_METHOD="ssh"
    REPO_URL="git@github.com:yourusername/repo.git"  # SSH格式地址
    SSH_PRIVATE_KEY="/path/to/your/private_key"      # 默认无需修改
    
    • GIT_AUTH_METHOD:设置为 ssh,表明使用 SSH 认证方式。
    • REPO_URL:请将其替换为你实际要访问的 Git 仓库的 SSH 格式地址。
    • SSH_PRIVATE_KEY:一般使用默认生成的私钥路径即可,无需修改。
  4. 注意

    • 在执行 git clone XXX 命令时,若使用的是 root 用户,可能会遇到未配置 SSH 公钥认证的问题。此时,你可以将已配置好 SSH 公钥认证的用户的 .ssh 文件夹复制到 root 用户的家目录下,操作命令如下:

      cp -r /home/yourusername/.ssh /root/
      

      请将 /home/yourusername 替换为实际已配置好 SSH 公钥认证的用户的家目录。

      通过以上步骤,你就可以使用 SSH 公钥认证的方式安全地访问 Git 仓库了。

方法一:通过命令行参数全局修改构建目录

在Maven命令中,使用 -Dproject.build.directory 参数指定构建输出目录。这会改变所有构建产物(包括JAR)的存放路径。

mvn clean package -Dproject.build.directory=/自定义/路径 -DskipTests

生成的JAR将位于:/自定义/路径/your-project-version.jar

方法二:在pom.xml中配置插件输出路径

针对具体插件(如maven-jar-pluginspring-boot-maven-plugin),在pom.xml中添加配置:

示例1:配置maven-jar-plugin
<build>
 <plugins>
     <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
         <version>3.3.0</version>
         <configuration>
             <outputDirectory>${project.basedir}/自定义目录</outputDirectory>
         </configuration>
     </plugin>
 </plugins>
</build>
示例2:配置Spring Boot插件
<plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <configuration>
     <outputDirectory>${project.basedir}/自定义目录</outputDirectory>
 </configuration>
</plugin>

注意事项

路径格式:建议使用绝对路径或基于项目根目录的相对路径(如custom/target)。
多模块项目:若项目包含子模块,全局参数会影响所有模块的构建路径。
插件覆盖:确保配置覆盖了实际打包所用的插件(如Spring Boot项目需配置对应的插件)。

选择方法一快速调整所有输出,或方法二精确控制特定插件的路径。

### 如何在 Linux 系统中部署运行 Spring Boot Java 应用程序 #### 准备工作 为了确保 Spring Boot 应用能够在 Linux 环境下正常运行,需要先完成必要的准备工作。这包括安装 JDK 和 Maven 工具链。 JDK 是运行 Java 应用的基础环境,在 CentOS 或 RHEL 中可以通过 `yum` 命令来安装 OpenJDK[^3]。验证其安装是否成功可以使用如下命令: ```bash java -version ``` Maven 则用于构建项目并打包成可执行的 JAR 文件。如果尚未安装 Maven,则需手动下载解压或者通过包管理器进行安装。 #### 构建与打包应用 开发人员通常会利用 IDE 开发工具编写代码并通过内置插件完成编译操作;然而对于生产环境中使用的版本控制流程来说,更推荐的方式是从源码仓库最新稳定分支之后再借助脚本自动化处理整个过程——即从克隆远程 Git 仓库开始直到最终生成目标文件为止的一系列动作都应当被封装起来以便重复调用而无需人工干预过多细节部分[^1]。 当一切就绪后,可通过以下方式创建一个独立运行的应用程序包(fat jar),它包含了所有的依赖项以及主类定义信息: ```bash mvn clean package -DskipTests=true ``` 上述命令中的 `-DskipTests=true` 参数表示跳过单元测试阶段以加快速度,但在实际发布前建议移除该选项从而全面检验功能正确性。 #### 设置为系统服务 为了让 Spring Boot 应用能够随操作系统一起自动加载启动,并且具备更好的进程管理和日志记录能力,将其注册成为 systemd service 单元是一个非常不错的选择。具体做法如下所示: 编辑一个新的配置文件 `/etc/systemd/system/springbootapp.service` ,内容大致结构如下: ```ini [Unit] Description=My Awesome Spring Boot Application Service After=syslog.target network-online.target [Service] User=someuser Group=somegroup ExecStart=/usr/bin/java -jar /path/to/your/application.jar --spring.profiles.active=prod SuccessExitStatus=143 Restart=on-failure RestartSec=10s WorkingDirectory=/opt/my-spring-boot-app/ Environment="JAVA_OPTS=-Xmx512m" StandardOutput=append:/var/log/springbootapp.log StandardError=inherit [Install] WantedBy=multi-user.target ``` 保存修改后的文件后重新载入守护进程配置列表使之生效: ```bash sudo systemctl daemon-reload ``` 接着就可以像操控普通的服务那样启用、停止或是查看状态了: ```bash sudo systemctl start springbootapp sudo systemctl stop springbootapp sudo systemctl status springbootapp ``` 最后一步就是开启开机自启属性设置: ```bash sudo systemctl enable springbootapp ``` 这样即使机器重启也能保证业务逻辑持续在线提供对外接口访问支持。 --- #### 提供 API 文档 除了基本的功能实现之外,良好的用户体验还离不开清晰易懂的帮助手册指导新用户快速上手熟悉各项参数含义及其作用范围等内容描述。因此可以在项目的初始阶段集成 Swagger UI 组件来自动生成 RESTful Web Services 的交互式文档页面[^2]。 只需要简单几步就能让开发者享受到这一便利之处带来的好处:添加相应 Starter POM 至 pom.xml 文件当中去引入所需库资源;随后激活对应路径映射规则即可展示效果出来啦! ```xml <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger.version}</version> </dependency> ``` 然后在任意 Controller 类上方加上注释标记 @EnableSwagger2 来触发机制运作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值