Jenkins自动化编译部署Spring Boot项目

介绍

Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。

Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

一、下载安装Jenkins

1、安装jenkins

jenkins官网地址提供了多种安装方式,我这边使用的是Ubuntu系统安装,注意最新版本的jenkins安装需要jdk21及以上的版本支持,官方提供了安装方式,如果自己本身的jdk环境较低但是又不想改变可以给jenkins指定安装的jdk版本

2、下载安装jdk21

bash 复制代码
# 1. 进入你的专属 JDK 目录
cd /home/xx/jdk/

# 2. 删掉旧的、不兼容的 jdk17 文件夹
rm -rf jdk17

# 3. 创建全新的 jdk21 目录并进入
mkdir -p jdk21 && cd jdk21

# 4. 下载精准版本号的官方 Oracle JDK 21 稳定版
wget https://download.oracle.com/java/21/archive/jdk-21.0.4_linux-x64_bin.tar.gz

# 5. 解压并自动剥离外层目录,让核心文件直接平铺在 jdk21 下
tar -zxvf jdk-21.0.4_linux-x64_bin.tar.gz --strip-components=1

# 6. 删除下载的压缩包,释放空间
rm jdk-21.0.4_linux-x64_bin.tar.gz

3、修改jenkins专属环境路径

bash 复制代码
# 自动修改 Jenkins 专属 Java 指令到全新的 JDK 21 路径
echo -e "[Service]\nEnvironment=\"JENKINS_JAVA_CMD=/home/xx/jdk/jdk21/bin/java\"" | sudo tee /etc/systemd/system/jenkins.service.d/override.conf

4、重启服务

bash 复制代码
# 1. 刷新系统服务配置,让刚才修改的路径生效
sudo systemctl daemon-reload

# 2. 清除之前由于 Java 17 不满足引发的"启动太快"报错计数锁
sudo systemctl reset-failed jenkins.service

# 3. 重新启动 Jenkins
sudo systemctl start jenkins

# 4. 见证奇迹的时刻,查看最终运行状态
sudo systemctl status jenkins.service

5、访问测试端口为8080

6、插件安装就选择默认安装新手使用

二、创建流水线任务

1、新建item选择流水线

2、配置脚本

3、输入脚本

3.1配置远程登录ssh

因为我们测试是自动化编译,打包部署到服务器,所以需要配置一些环境,密钥等,首先我们如果是要打包到服务器需要密钥去ssh登录到远程服务器

bash 复制代码
# 在 Jenkins 服务器上运行
ssh-keygen -t rsa -b 4096
ssh-copy-id root@xx.xx.xx.91

1、输入这个命令会有提示

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):

2 、当你看到这个提示时,系统是在问你:"你想把生成的密钥文件保存在哪里?"

3 、括号里的 (/root/.ssh/id_rsa) 是系统默认给你的路径和文件名。

4 、绝大多数情况下,你直接按回车(Enter)键即可。

5、按回车后,系统会默认把密钥保存在相应的位置,接着会提示你设置密码(Passphrase),连续再按两次回车(不设置密码)就可以完成密钥生成了。

6 、密钥生成后,你需要把公钥发给你的目标服务器(xx.xx.xx.91),直接在当前终端运行这行命令即可(会提示输入一次目标服务器的 root 密码)

bash 复制代码
sudo ssh-copy-id -i /root/.ssh/id_rsa.pub root@xx.xx.xx.91

7、首次连接确认:

The authenticity of host 'xx.xx.xx.91 (...)' can't be established.
Are you sure you want to continue connecting (yes/no/fingerprint)?

8、输入目标服务器密码回车即可

3.2配置Credentials

配置自动拉去gitee代码仓库代码添加 Gitee 凭据 (Credentials)如果你的 Gitee 仓库是公开的,可以跳过此步。如果是私有仓库:进入 Manage Jenkins -> Credentials -> System -> Global credentials -> Add Credentials。类型选择 Username with password,输入你的 Gitee 账号和密码(或 Token),别名(ID)自己取一个,但是要和脚本里面的相对应。

3.3安装git

因为要从git拉取代码,所以要先安装git,如果有git环境的话就不用重复安装了

bash 复制代码
#更新系统的软件包列表:
sudo apt update

#安装 Git 客户端:
sudo apt install git -y

#验证是否安装成功:
git --version

3.4配置编译环境

因为我要自动化编译和部署spring boot环境,并且我项目用的是jdk1.8和maven3.x所以我需要给项目单独配置编译环境

jdk安装,我这是已经安装好了所以指定目录就可以了,如果没有安装也可以选择自动安装

maven安装

点击保存即可

3.5脚本编写

我这弄了一个自动化编译打包带远程服务器的脚本

bash 复制代码
pipeline {
    agent any

    environment {
        TARGET_SERVER = 'xx,xx。xx.91'
        DEPLOY_USER = 'ubuntu'
        GIT_URL = 'https://gitee.com/jiangyongjie/xx.git'
        APP_NAME = 'targetSystem'
        TARGET_DIR = '/home/targetSystem/jar'
    }

    stages {
        stage('1. 克隆代码') {
            steps {
                echo '正在从 Gitee 克隆若依项目代码...'
                checkout([$class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[credentialsId: '01', url: "${env.GIT_URL}"]]])
            }
        }

        stage('2. 使用 JDK 1.8 编译打包') {
            steps {
                echo '正在编译若依多模块项目...'
                script {
                    def jdkHome = tool 'JDK1.8'
                    def mvnHome = tool 'maven3'
                    withEnv(["JAVA_HOME=${jdkHome}", "PATH+MAVEN=${mvnHome}/bin", "PATH+JDK=${jdkHome}/bin"]) {
                        sh 'mvn clean package -DskipTests'
                    }
                }
            }
        }

        stage('3. 传输 ruoyi-admin.jar 到目标服务器') {
            steps {
                echo "正在向 ${env.TARGET_SERVER} 传输 Jar 包..."
                sh "scp -o StrictHostKeyChecking=no ruoyi-admin/target/*.jar ${env.DEPLOY_USER}@${env.TARGET_SERVER}:${env.TARGET_DIR}/${env.APP_NAME}.jar"
            }
        }

        stage('4. 远程自动化部署(安全平滑重启)') {
            steps {
                echo "正在安全重启若依后端服务..."
                sh """
                ssh -o StrictHostKeyChecking=no ${env.DEPLOY_USER}@${env.TARGET_SERVER} "
                    cd ${env.TARGET_DIR}
                    
                    # 1. 安全查找旧进程(注意:加上了 grep -v grep 过滤,防止误杀当前 SSH 连接)
                    PIDS=\\\$(ps -ef | grep ${env.APP_NAME}.jar | grep -v grep | awk '{print \\\$2}')
                    
                    if [ -n '\\\$PIDS' ]; then
                        echo '发现正在运行的旧服务进程: '\\\$PIDS
                        for pid in \\\$PIDS; do
                            echo '正在终止进程: '\\\$pid
                            kill -9 \\\$pid 2>/dev/null
                        done
                        sleep 2
                    else
                        echo '未发现运行中的旧服务,准备直接启动。'
                    fi
                    
                    # 2. 后台启动若依新服务
                    echo '正在后台启动 [targetSystem.jar]...'
                    # 强制清除以前可能残留的临时进程变量,防止被 Jenkins 误当作僵尸进程清理
                    export JENKINS_NODE_COOKIE=dontKillMe
                    nohup java -jar ${env.APP_NAME}.jar > server.log 2>&1 &
                    
                    # 3. 稳健验证进程是否成功拉起
                    sleep 5
                    NEW_PID=\\\$(ps -ef | grep ${env.APP_NAME}.jar | grep -v grep | awk '{print \\\$2}' | head -n 1)
                    if [ -n '\\\$NEW_PID' ]; then
                        echo '==================================================='
                        echo ' 恭喜!若依后端服务自动化部署成功!'
                        echo ' 当前服务最新进程号 (PID): '\\\$NEW_PID
                        echo '==================================================='
                    else
                        echo '错误:服务未能成功拉起,请登录服务器检查:'
                        echo 'cat ${env.TARGET_DIR}/server.log'
                        exit 1
                    fi
                "
                """
            }
        }
    }

    post {
        success {
            echo "【构建成功】若依项目已无缝更新并成功运行在 ${env.TARGET_SERVER}!"
        }
        failure {
            echo "【构建失败】请检查上方控制台日志。"
        }
    }
}

三、开始构建

1、选择项目

点击创建的流水线项目

2、开始构建

构建失败的话可以点击进去看具体的错误信息

3、日志输出

部署成功

相关推荐
闪电悠米1 小时前
黑马点评-Redis 消息队列-01_why_redis_mq
java·数据库·spring boot·redis·缓存·junit·消息队列
serve the people2 小时前
Elasticsearch(3) show me some examples
大数据·elasticsearch·jenkins
搞科研的小刘选手2 小时前
【国家电网省科学研究院支持】第七届物联网、人工智能与电气能源国际学术会议(IoTAIEE 2026)
人工智能·物联网·机器学习·计算机视觉·自动化·能源·电气
梦想的旅途22 小时前
企业微信自动化系统从 0 到 1:架构设计与踩坑实录
网络·机器人·自动化·企业微信·rpa
我登哥MVP2 小时前
Spring Boot 从“会用”到“精通”:内容协商原理
java·spring boot·后端·spring·java-ee·maven·lua
2501_941982052 小时前
# 企业微信群管理机器人的技术实现:从创建到解散的完整方案
网络·机器人·自动化·企业微信·rpa
孙高飞2 小时前
从0开始学AI测试系列-工具篇
人工智能·自动化·测试用例
梦想的旅途22 小时前
企业微信外部群消息收发系统的异步处理与可靠性设计
机器人·自动化·企业微信
牛奶咖啡132 小时前
CI/CD——通过Jenkins插件实现与K8s集成并部署应用到k8s集群的实践保姆级教程
ci/cd·kubernetes·jenkins·jenkins安装k8s插件·jenkins对k8s配置凭据·jenkins配置pod模板·编写流水线脚本部署应用到k8s