jenkins流水线部署springboot项目

流水线部署流程如下图:

一、git安装

1、 服务器上安装 Git

  • 如果是 CentOS/RHEL 系统:sudo yum install git -y
  • 如果是 Ubuntu/Debian 系统:sudo apt-get install git -y

2、验证 Git 安装

登录到 Jenkins 服务器,执行git --version确认 Git 已正确安装

3、在 Jenkins 中配置 Git 凭据

  • 登录 Jenkins 管理界面
  • 进入 "系统管理/凭据/系统/全局凭据 (unrestricted)"
  • 设置全局凭据id,增加git用户账号密码,后续流水线会使用凭证id

二、maven安装

1、服务器上安装maven

下载maven

官网下载地址**:** https://maven.apache.org/download.cgi

解压 Maven

复制代码
cd /data
sudo tar xzvf apache-maven-3.9.11.tar.gz

设置环境变量

复制代码
# 配置环境变量
 vi /etc/profile
 
# 在末尾添加
export MAVEN_HOME=/data/apache-maven-3.9.11
export PATH=$PATH:$MAVEN_HOME/bin

# 使环境变量生效
source /etc/profile

验证安装是否成功

复制代码
mvn -v

2、在 Jenkins 中配置 maven

配置maven路径

三、服务器间免密登录配置

因需要将部署文件上传到应用服务器及远程调用脚本,所以需要配置服务器间免密访问

1、生成SSH密钥对

首先,在本地机器上生成SSH密钥对。打开终端,运行以下命令:

复制代码
ssh-keygen -t rsa -b 2048

按照提示操作,可以按回车键接受默认的文件保存位置(通常在~/.ssh/id_rsa~/.ssh/id_rsa.pub),也可以为密钥设置密码(可选)。

2、复制公钥到远程服务器

使用ssh-copy-id命令将公钥复制到远程服务器上。例如,要将公钥复制到用户名为username的远程服务器(IP地址或主机名是remote_host):

复制代码
ssh-copy-id root@47.95.178.19

3、测试免密登录

复制代码
ssh root@47.95.178.19

首次需要输入密码,后续就不再需要了。

四、流水线编写

新建任务选择流水线

因是微服务项目服务很多及阿里云外网访问受限,所以拆分两个流水线:

1、下载代码、编译、打包

2、将打包的文件上传阿里云跳板机,利用跳板机复制到应用服务器及调用应用服务器启动脚本。

流水线1

复制代码
pipeline {
    agent any
    
    environment {
        // 配置Git仓库地址
        GIT_REPO = "http://10.11.20.38/cyjr/cloud.git"
        // 配置分支
        BRANCH = "test"
        // 配置存储在Jenkins中的Git凭证ID(需要提前配置)
        GIT_CREDENTIALS_ID = "glpat-iigmKJf2mLadomP-LXGX"  // 替换为你的凭证ID
        // 配置Maven打包后的文件名
        ARTIFACT_NAME = "your-project.jar"
        // 配置打包后的文件路径
        ARTIFACT_PATH = "target/${ARTIFACT_NAME}"
        // 配置服务器信息
        REMOTE_HOST = "47.95.178.19"  // 服务器IP
        REMOTE_USER = "root"         // 服务器用户名
        REMOTE_DIR = "/data/TEST/TEMP"       // 服务器部署目录
        // 应用启动脚本名称
        START_SCRIPT = "start.sh"
        CODE_DIR = "/data/.jenkins/workspace/Cloud-test"
    }
    
    stages {
        // 阶段1:清理旧目录 + 创建新目录
        stage('清理并创建目录') {
            steps {
                echo "开始清理旧目录:${CODE_DIR}"
                // 1. 删除旧目录(若存在,强制删除所有内容)
                sh "rm -rf ${CODE_DIR} || true"  // || true 避免目录不存在时脚本报错
                echo "旧目录清理完成,开始创建新目录:${CODE_DIR}"
                // 2. 创建新目录(-p 确保父目录不存在时也能创建)
                sh "mkdir -p ${CODE_DIR}"
                echo "新目录创建完成:${CODE_DIR}"
            }
        }
        stage('拉取代码') {
            steps {
                echo "进入目录:${CODE_DIR},开始拉取Git代码"
                // dir步骤:切换到指定目录执行后续操作(相当于cd ${CODE_DIR})
                dir("${CODE_DIR}") {
                    // 拉取Git代码(引用凭证,避免认证失败)
                    git(
                        url: "${GIT_REPO}",
                        branch: "${BRANCH}",
                        credentialsId: "${GIT_CREDENTIALS_ID}",
                    )
                    echo "Git代码拉取完成,当前目录文件列表:"
                    // 查看目录内容,验证代码是否拉取成功
                    sh "ls -l"
                }
            }
        }
        
        stage('Maven打包') {
            steps {
                echo "进入代码目录打包:${CODE_DIR}"
                dir("${CODE_DIR}") {
                    // 执行打包命令,增加 -e(详细错误日志)、-U(强制更新快照依赖)
                    sh '''
                        echo "Maven版本:$(mvn -v)"
                        echo "开始执行打包命令:mvn clean package -Dmaven.test.skip=true -Ptest -e -U"
                        mvn clean package -Dmaven.test.skip=true -Ptest -e -U
                    '''
                }
            }
        }
    }
}

流水线2

复制代码
pipeline {
    agent any
    
    environment {
        // 配置服务器信息
        REMOTE_HOST = "47.95.178.19"  // 服务器IP
        REMOTE_USER = "root"         // 服务器用户名
        REMOTE_DIR = "/data/PROD"       // 服务器部署目录
        // 应用启动脚本名称
        CODE_DIR = "/data/.jenkins/workspace/Cloud-prod"
        JAR_NAME = "cyjr-auth"
    }
    
    stages {
        
        stage('上传到服务器') {
            steps {
                echo "上传文件到远程服务器..."
                dir("${CODE_DIR}") {
                
                     // 确保远程目录存在
                    // sh """
                    //     ssh ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_DIR}"
                    // """
                    
                    // 上传打包好的jar文件
                    sh """
                        scp cyjr-modules/${JAR_NAME}/target/${JAR_NAME}.jar ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/TEMP/
                    """
                }
               
            }
        }
        
        stage('应用拷贝及启动') {
            steps {
                echo "在远程服务器上启动应用..."
                sh """
                    ssh ${REMOTE_USER}@${REMOTE_HOST} "cd ${REMOTE_DIR} && ./${JAR_NAME}.sh"
                """
            }
        }
    }
    
    // post {
    //     success {
    //         echo "流水线执行成功!应用已成功部署并启动"
    //         // 可以添加邮件通知等操作
    //     }
    //     failure {
    //         echo "流水线执行失败!"
    //         // 可以添加失败通知等操作
    //     }
    //     always {
    //         echo "流水线执行结束"
    //     }
    // }
}

跳板机器脚本

复制代码
#!/bin/bash

# 配置参数 - 根据实际情况修改以下变量
LOCAL_JAR_PATH="TEMP/cyjr-auth.jar"       # 本地JAR文件路径
REMOTE_USER="root"                                # 远程服务器用户名
REMOTE_HOST="172.16.2.11"                       # 远程服务器地址或IP
REMOTE_JAR_DIR="/usr/local/application/cyjr-auth"        # 远程服务器存放JAR的目录
REMOTE_SCRIPT="/usr/local/application/cyjr-auth/start.sh"             # 远程服务器上要执行的脚本路径
SSH_PORT=22                                           # SSH端口,默认为22

# 检查本地JAR文件是否存在
if [ ! -f "$LOCAL_JAR_PATH" ]; then
    echo "错误:本地JAR文件 $LOCAL_JAR_PATH 不存在!"
    exit 1
fi

# 创建远程目录(如果不存在)
echo "正在创建远程目录(如果不存在)..."
ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST "mkdir -p $REMOTE_JAR_DIR"

# 检查SSH连接是否成功
if [ $? -ne 0 ]; then
    echo "错误:无法连接到远程服务器 $REMOTE_HOST"
    exit 1
fi

# 拷贝JAR文件到远程服务器
echo "正在将JAR文件拷贝到远程服务器..."
scp -P $SSH_PORT $LOCAL_JAR_PATH $REMOTE_USER@$REMOTE_HOST:$REMOTE_JAR_DIR/

# 检查文件传输是否成功
if [ $? -ne 0 ]; then
    echo "错误:JAR文件传输失败!"
    exit 1
fi

# 远程执行指定脚本
echo "正在远程执行脚本 ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST $REMOTE_SCRIPT ..."
ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST $REMOTE_SCRIPT

echo "操作完成:JAR文件已成功拷贝并执行远程脚本"

应用启动脚本中需要指定绝对路径,不然会报错

复制代码
#!/bin/sh
# 定义应用目录和jar文件的绝对路径
APP_DIR="/usr/local/application/cyjr-gateway"
JAR_FILE="${APP_DIR}/cyjr-gateway.jar"

# 检查jar文件是否存在
if [ ! -f "$JAR_FILE" ]; then
    echo "错误: 找不到$JAR_FILE文件"
    exit 1
fi

# 查找进程并杀死(仅当进程存在时)
PID=$(ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}')
if [ -n "$PID" ]; then
    kill -9 $PID
    echo "已杀死进程 $PID"
    sleep 1s
else
    echo "服务进程未运行,无需杀死"
fi

# 进入应用目录
cd "$APP_DIR" || {
    echo "错误: 无法进入目录$APP_DIR"
    exit 1
}


sleep 1s
# start app
nohup java -jar -javaagent:/usr/local/application/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=cyjr-gateway -Dskywalking.collector.backend_service=172.16.2.167:11800 "$JAR_FILE" > nohup.log 2>&1 &
# view startup log
# 查看启动日志,但只持续30秒或显示100行后退出
timeout 30s tail -n 100 -f nohup.log

五、流水线执行

相关推荐
蜜蜜不吃糖6 小时前
解决Vcenter告警datastore存储容量不足问题
linux·运维·服务器
东城绝神6 小时前
《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署redis 7.4.5容器版分片集群》
linux·运维·redis·架构·分片集群
迷路爸爸1807 小时前
解决GitHub SSH密钥冲突:一台电脑多账户配置
运维·ssh·github
newxtc7 小时前
【浙江政务服务网-注册_登录安全分析报告】
运维·selenium·安全·政务
FJW0208148 小时前
【Linux】系统中的文件管理
linux·运维·服务器
豆是浪个8 小时前
Linux(Centos 7.6)命令详解:rpm
linux·运维·centos
神秘人X7079 小时前
Jenkins 持续集成与部署指南
运维·ci/cd·jenkins
晓梦.9 小时前
Linux
linux·运维·服务器
运维帮手大橙子9 小时前
Linux如何安装使用Rust指南
linux·运维·rust