当前位置: 首页 > news >正文

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

五、流水线执行

http://www.dtcms.com/a/515356.html

相关文章:

  • YOLOv5:目标检测的实用派王者
  • 《工业之心:Blender 工业场景解构》
  • 【Linux网络】应用层自定义协议
  • unity免费改名工具-Mulligan Renamer
  • Git分支的多人协作
  • 服务外包网站成都住建局官网app
  • 【ABAP函数】+ALSM_EXCEL_TO_INTERNAL_TABLE批导长字段
  • 艺术学院网站模板wordpress二手车模板
  • docker api 常用接口
  • flutter鸿蒙:实现类似B站或抖音的弹幕功能
  • 从静态模型到数据驱动:图观模型编辑器让工程设备真实还原
  • 了解Docker的多阶段构建(Multi-stage Build)
  • [特殊字符] Berry.Live:开箱即用的.NET直播流媒体服务器
  • 网站模板的修改宝安企业网站建设
  • 网站开发软件费用2018网站流量怎么做
  • 数据结构:顺序表讲解(1)
  • 第二次作业-第二章时间服务
  • Python爬虫实战:获取香港恒生指数历史数据与趋势分析
  • 【Frida Android】基础篇11:Native层hook基础——修改原生函数的返回值
  • 什么是DNS负载均衡?提升网站稳定性与容错性的方法
  • 设计自学网站哪个好建设银行网站怎么短信转账
  • 网站如何做seo优化教程迪虎科技网站建设
  • win10底部搜索栏怎么关闭 图文详解
  • 网站备案密码是什么样的大冶建设局网站
  • python学习之进程
  • PAGE下载安装图解教程(附安装包)
  • 接口练习哈哈
  • 【原理解析】详细剖析 HAMi 在支持 NVIDIA GPU 拓扑感知调度时的具体设计与实现原理
  • Dubins曲线:最短有向路径的数学之美与工程实现
  • 解读“Time Model Statistics”中的“sql execute elapsed time”