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 anyenvironment {// 配置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" // 服务器IPREMOTE_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 anyenvironment {// 配置服务器信息REMOTE_HOST = "47.95.178.19" // 服务器IPREMOTE_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" ]; thenecho "错误:本地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 ]; thenecho "错误:无法连接到远程服务器 $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 ]; thenecho "错误:JAR文件传输失败!"exit 1
fi# 远程执行指定脚本
echo "正在远程执行脚本 ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST $REMOTE_SCRIPT ..."
ssh -p $SSH_PORT $REMOTE_USER@$REMOTE_HOST $REMOTE_SCRIPTecho "操作完成:JAR文件已成功拷贝并执行远程脚本"
应用启动脚本中需要指定绝对路径,不然会报错
#!/bin/sh
# 定义应用目录和jar文件的绝对路径
APP_DIR="/usr/local/application/cyjr-gateway"
JAR_FILE="${APP_DIR}/cyjr-gateway.jar"# 检查jar文件是否存在
if [ ! -f "$JAR_FILE" ]; thenecho "错误: 找不到$JAR_FILE文件"exit 1
fi# 查找进程并杀死(仅当进程存在时)
PID=$(ps -ef | grep "$JAR_FILE" | grep -v grep | awk '{print $2}')
if [ -n "$PID" ]; thenkill -9 $PIDecho "已杀死进程 $PID"sleep 1s
elseecho "服务进程未运行,无需杀死"
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