Jenkins 部署 RuoYi

目录

1、项目介绍

2、部署若依

clone 源代码

导入数据库到 node-16

修改 RuoYi 配置文件

推送 RuoYi 项目至 Gitlab

3、配置 Jenkins

配置本地 Maven

Jenkins 配置 Maven

新建 Maven 项目

编写构建后的脚本

Jenkins 构建后执行脚本

4、Jenkins 传递参数

设置项目部署动作

Jenkins 获取 git 标签

Jenkins 设置主机参数

配置 javagroup 主机

测试参数

5、配置参数化构建项目

修改 maven-deploy.sh 脚本

测试脚本

配置 Jenkins 构建后执行该脚本

测试回滚

6、Pipeline

概念介绍

创建 ruoyi-pipline 并构建测试

使用流水线语法生成脚本执行命令

修改 pipline 工作脚本

查看本地目录和日志

完整脚本


1、项目介绍

若依官网:http://doc.ruoyi.vip/ruoyi/

源代码地址:https://gitee.com/y_project/RuoYi

若依项目是一款使用java开发的后台管理系统,可以用于所有的Web应用程序, 如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低,同时支持移动客户端访问。 若依项目有单应用版本,前后端分离版本和微服务版本可供选择,本实例部署单应用版。

2、部署若依

主机名称

IP地址

服务

node-15

192.168.137.115

gitlab

node-04

192.168.137.116

mysql

node-17

192.168.137.117

jenkins

clone 源代码

导入数据库到 node-16

# 创建 ry 数据库 
mysql -uroot -p123456 -e "create database ry" # 导入数据库文件 
mysql -uroot -p123456 ry < quartz.sql 
mysql -uroot -p123456 ry < ry_20210924.sql 
mysql -uroot -p123456 -e "use ry;show tables"#  给 root 账号授权 
mysql> grant all on *.* to root@'192.168.137.%' identified by '123456'; 
mysql> flush prileges;
修改 RuoYi 配置文件

推送 RuoYi 项目至 Gitlab

在Gitlab创建ruoyi空项目

3、配置 Jenkins
配置本地 Maven

maven 用于构建和管理任何基于 Java 的项目的工具,在文件中添加相应的配置,maven 就会自动的下载相应的 jar 包;下载依赖,只要配置的 jar 包所依赖的其他 jar 包都会被它自动下载下来;可以直接通过它打包 war 或者 jar 项目。

# maven 下载 
wget http://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz# maven 安装 
tar -zxvf apache-maven-3.8.6-bin.tar.gz -C /usr/local/ # 添加软连接 
ln -s /usr/local/apache-maven-3.8.6/bin/* /usr/local/bin/ 
mvn -version

# 修改Maven仓库源
vim /usr/local/apache-maven-3.8.6/conf/settings.xml
<mirror><id>alimaven</id><name>aliyun maven</name><mirrorOf>central</mirrorOf><url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

Jenkins 配置 Maven

安装Maven Integration、Pipeline Maven Integration、Maven Release插件

新建 Maven 项目

编写构建后的脚本

注意:此脚本执行前提是,每台机器之间都做免密(包括自身)

vim maven-deploy.sh
#!/bin/bash
jardir="/var/lib/jenkins/workspace/ruoyi/ruoyi-admin/target/"
jar="ruoyi-admin.jar"
workdir="/javaapp"
iplist="192.168.137.116 192.168.137.117" #注意配置免密认证for ip in $iplist
dossh root@$ip "ls $workdir"if [ $? -ne 0 ];thenssh root@$ip "mkdir -p $workdir/{log,backup}"echo -e "\033[32m$ip /app create sucessful!!!\e[0m"elseecho -e "\033[33m$ip /app is exist!!!\e[0m"fiif [ -f $jardir$jar ];thenssh root@$ip "rm -rf $workdir/backup/*"ssh root@$ip "mv $workdir/*.jar $workdir/backup"scp $jardir$jar root@$ip:$workdir# 是否需要下载javassh root@$ip "which java &> /dev/null " if [ $? -ne 0 ];thenssh root@$ip "yum install -y  java-11-openjdk"fi# 结束ry进程ryprocess=$(ssh root@$ip ps -ef | grep ruoyi-admin.jar | grep -v grep | awk '{print $2}')if [ $ryprocess ];thenssh root@$ip "kill $ryprocess"fissh root@$ip "nohup java -jar $workdir/$jar &> $workdir/log/ruoyi-$(date "+%F-%T").log &"fi
done# 测试脚本
[root@node-17 ~]# sh -x maven-deploy.sh

Jenkins 构建后执行脚本

注意:脚本应该赋予执行权限

sudo ssh root@192.168.137.117 ./maven-deploy.sh

4、Jenkins 传递参数
设置项目部署动作

Jenkins 获取 git 标签

jenkins可以根据git代码tag(标签)拉取指定的标签分支代码进行部署,方便进行版本回滚

下载 git parameter 插件

添加参数:git 参数

gitlab 添加版本标签

在Jenkins 查看 git 标签

Jenkins 设置主机参数

配置 javagroup 主机

测试参数

编写测试脚本

# 写测试脚本
[root@node-17 ~] vim test.sh
#!/bin/bash
echo $1 >> /root/test.log
echo $2 >> /root/test.log
echo $3 >> /root/test.logchmod +x test.sh

配置 Jenkins 调用脚本

使用参数构建

5、配置参数化构建项目
修改 maven-deploy.sh 脚本
#!/bin/bash
#author: lemonZ
#description: deploy/rollback ruoyi
#date: 2022年9月11日 18:59:49version=$2
iplist=$3 #注意配置免密认证
target="ruoyi"
jardir="/var/lib/jenkins/workspace/$target/ruoyi-admin/target/"
jar="ruoyi-admin.jar"
date_time=$(date "+%F-%T")
target_version="$(basename -s .jar $jar)-$version-${date_time}"
tar_name="$target_version.tar.gz"
workdir="/javaapp/$target"
backup_num=3#检测客户机工作目录
check_workdir(){ssh root@$ip "ls $workdir &> /dev/null"if [ $? -ne 0 ];thenecho "创建$workdir"ssh root@$1 "mkdir -p $workdir/{$2,backup}"elseecho "清空$workdir 工作目录下$target 项目"ssh root@$1 "rm -rf $workdir/${target}*" 		ssh root@$1 "mkdir -p $workdir/{$2,backup}"fi
}#cp jar包到分发目录
cp_java(){if [ ! -d $workdir ];thenmkdir -p  $workdirficd $jardirtar -zcf $workdir/$tar_name $jar
}#scp jar包到远程目录
scp_java(){scp $workdir/$2 root@$1:$workdir/backup
}#本地分发目录和远程备份目录每个版本保留3个备份
rm_backup(){echo $workdircd $workdir; rm -rf $(ls . | grep $version | grep -v "$(ls . | grep $version | sort -r |head -$backup_num)" )backup_file=$(ssh root@$1 "cd $workdir/backup ; ls -t | grep $version")num=1for i in $backup_filedowhile [ $num -gt $backup_num ]dossh root@$1 "rm -rf /javaapp/ruoyi/backup/$i"echo "删除$i"breakdonelet num++done}
#远程主机安装jdk11
install_java11(){ssh root@$1 "which java &> /dev/null"if [ $? -ne 0 ];thenssh root@$1 "yum install -y  java-11-openjdk"fi
}#启动java项目
start_java(){ryprocess=$(ssh root@$ip ps -ef | grep $(basename -s .jar $jar) | grep -v grep | awk '{print $2}') if [ "$ryprocess" ];thenssh root@$1 kill "$ryprocess"fissh root@$1 "rm -rf $workdir/$3/*"ssh root@$1 "tar -zxf $workdir/backup/$2 -C $workdir/$3"ssh root@$1 "cd $workdir/$3 ; nohup java -jar $jar &>$workdir/$3/${3}.log &"
}deploy(){for ip in $iplistdocheck_workdir $ip $target_versioncp_java scp_java $ip $tar_name install_java11 $ipstart_java $ip $tar_name $target_versionrm_backup $ipdone
}#回滚策略,根据版本回滚到上一次构建
rollback(){last_version=$(ls $workdir | sort -r | sed -n '2p' | awk -F "-" '{print $3}')if [ $version == $last_version ];thenrollback_version_tar=$(ls $workdir | grep $version | sort -r | sed -n "2p")elserollback_version_tar=$(ls $workdir | grep $version | sort -r | sed -n "1p")firollback_version=$(basename -s .tar.gz $rollback_version_tar)for ip in $iplistdols $workdir | grep $version &> /dev/nullif [ $? -eq 0 ];thenssh root@$ip ls $workdir/backup/$rollback_version_tarif [ $? -eq 0 ];thencheck_workdir $ip $rollback_versionstart_java $ip $rollback_version_tar $rollback_versionelsecheck_workdir $ip $rollback_versioninstall_java11 $ipscp_java $ip $rollback_version_tar		start_java $ip $rollback_version_tar $rollback_versionfielsedeployfi		done
}case $1 indeploy)deploy;;rollback)rollback;;*)echo "use: $0 [deploy|rollback]"exit
esac
测试脚本
sh -x maven-deploy.sh rollback v4.7.6 192.168.137.116

查看本机项目目录

查看远程项目目录

配置 Jenkins 构建后执行该脚本
sudo ssh root@192.168.137.117 ./maven-deploy.sh $action $tag $hostgroup

测试回滚

首先再Gitlab创建新标签:这里假设我们新创建了v4.7.7这个标签

使用新标 v4.7.7 签构建程序

查看项目目录

重新构建使用 v4.7.6 标签:测试回滚

6、Pipeline
概念介绍

官网:https://www.jenkins.io/doc/book/pipeline/

pipline是帮助Jenkins实现CI到CD转变的重要角色,是运行在jenkins 2.X版本的核心插件,简单来说Pipline就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程,从而实现单个任务很难实现的复杂流程编排和任务可视化,Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本。

Pipeline 语法

说明

Stage

阶段,一个pipline可以划分为若干个stage,每个stage都是一个操作,比如clone代码、代码编译、代码测试和代码部署,阶段是一个逻辑分组,可以跨多个node执行。

Node

节点,每个node都是一个jenkins节点,可以是jenkins master也可以是jenkins agent,node是执行step的具体服务器。

Step

步骤,step是jenkins pipline最基本的操作单元,从在服务器创建目录到构建容器镜像,由各类Jenkins 插件提供实现,例如: sh “make”

pipline优势

  • 可持续性:jenkins的重启或者中断后不影响已经执行的Pipline Job
  • 支持暂停:pipline可以选择停止并等待人工输入或批准后再继续执行。
  • 可扩展:通过groovy的编程更容易的扩展插件。
  • 并行执行:通过groovy脚本可以实现step,stage间的并行执行,和更复杂的相互依赖关系。
创建 ruoyi-pipline 并构建测试

简单的 pipline 工作脚本

node {stage("clone 代码"){echo "代码 clone"}stage("代码构建"){echo "代码构建"}stage("代码测试"){echo "代码测试"}stage("代码部署"){echo "代码部署"}
}

使用流水线语法生成脚本执行命令

git credentialsId: '81283712-9db6-4f33-95f1-be6bc79712c4', url: 'git@192.168.137.115:lemon/ruoyi.git'
修改 pipline 工作脚本
node {stage("clone 代码"){git credentialsId: '81283712-9db6-4f33-95f1-be6bc79712c4', url: 'git@192.168.137.115:lemon/ruoyi.git'}stage("代码构建"){echo "代码构建"}stage("代码测试"){echo "代码测试"}stage("代码部署"){echo "代码部署"}
}

查看本地目录和日志

完整脚本
pipeline {agent anytools {maven 'apache-maven-3.8.6' }stages {stage('Example') {steps {sh 'mvn --version'}}stage("clone 代码"){steps {git credentialsId: '81283712-9db6-4f33-95f1-be6bc79712c4', url: 'git@192.168.137.115:lemon/ruoyi.git'}}stage("代码构建"){steps {sh 'cd /var/lib/jenkins/workspace/ruoyi-pipline && mvn clean install'}}stage("代码拷贝"){steps {sh 'sudo ssh root@192.168.137.117 chown -R jenkins:jenkins /javaapp/'sh 'mkdir -p /javaapp/ruoyi-pipline'  sh 'cd /var/lib/jenkins/workspace/ruoyi-pipline/ruoyi-admin/target/ && cp ruoyi-admin.jar /javaapp/ruoyi-pipline '}    }stage("代码复制 "){steps {sh 'sudo ssh root@192.168.137.116 mkdir -p /javaapp/ruoyi-pipline'sh 'sudo scp /javaapp/ruoyi-pipline/ruoyi-admin.jar 192.168.137.116:/javaapp/ruoyi-pipline'}}stage("安装jdk11"){steps {sh 'sudo ssh root@192.168.137.116 yum install -y java-11-openjdk'  }}stage('杀死若依进程'){steps {sh 'sudo ssh root@192.168.137.116 "ps -ef | grep ruoyi | grep -v grep | awk \'{print $2}\' | xargs rm -rf {} ||  true "'}}stage('启动服务'){steps {sh 'sudo ssh root@192.168.137.116 "nohup java -jar /javaapp/ruoyi-pipline/ruoyi-admin.jar &"'}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React 19 Cheat Sheet

React 19让构建网站和应用程序变得更容易&#xff0c;更好。有了很酷的新东西&#xff0c;比如React编译器、Actions API和更好的Hooks&#xff0c;编写代码变得更快&#xff0c;管理应用程序的数据变得更简单 React 19让构建网站和应用程序变得更容易&#xff0c;更好。有了很…

maven 进行jdbc 查询

a. 在pom.xml 增加 依赖 mysql-connector-java依赖b. 编写 实体类, 按照 数据库表 生成对应的 类数据库类型 java 类型int intvarchar Stringdatetime java.util.Date注意事项: 属性名 采用 驼峰式命名法实体类 要求采用 封装的写…

MySQL之主从同步(openEuler版)

实验目的&#xff1a; 基于binlog和gtid两种方法实现主从同步 实验过程&#xff1a; 一、使用binlog方法实现MySQL的主从同步 主库配置 配置文件&#xff1a; [rootopeneuler ~]# vim /etc/my.cnf//进入mysql配置文件配置server_id [rootopeneuler ~]# tail -1 /etc/my.cn…

股票价格预测项目

项目介绍 背景 股票价格预测一直是金融领域的热点问题。准确的预测可以帮助投资者作出更明智的决策。本项目旨在使用机器学习技术&#xff0c;特别是长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;来预测股票价格。 目标 开发一个基于LSTM的股票价格预测模型。使…

使用 Logstash 丰富你的 Elasticsearch 文档

作者&#xff1a;来自 Elastic David Pilato 我们在上一篇文章中看到&#xff0c;我们可以使用摄取管道中的 Elasticsearch Enrich Processor 在 Elasticsearch 中进行数据丰富。 但有时&#xff0c;你需要执行更复杂的任务&#xff0c;或者你的数据源不是 Elasticsearch&#…

python的scripts文件夹作用

Windows系统&#xff1a; Scripts文件夹通常位于Python的安装目录下&#xff0c;如C:\Python\Scripts。该文件夹内包含了各种有用的工具&#xff0c;例如pip、virtualenv等&#xff0c;这些工具有助于管理和配置Python环境和依赖包。 Linux系统&#xff1a; 在Linux系统中&…

集简云新增通义千问qwen 72b chat、qwen1.5 等多种大语言模型,提升多语言支持能力

通义千问再开源&#xff01;继发布多模态模型后&#xff0c;通义千问 1.5 版本也在春节前上线。 此次大模型包括六个型号&#xff1a;0.5B、1.8B、4B、7B、14B 和 72B&#xff0c;性能评测基础能力在在语言理解、代码生成、推理能力等多项基准测试中均展现出优异的性能&#x…

大话设计模式——5.代理模式(Proxy Pattern)

1.定义 为其他具体对象提供一种代理用以控制对这个对象的访问&#xff0c;属于结构型模式。 UML图&#xff1a; 2.示例 生活中有许多的代理&#xff0c;如房产中介&#xff0c;房主出售的房子挂在中介处&#xff0c;中介帮忙寻找需要的客户&#xff0c;客户不需要直接接触房…

linux tar分卷压缩与windows合并解压

linux tar分卷压缩 tar -czf - Shadowsocks | split -b 1000k -d - shadowsocks.tar.gz tar -czf - 文件夹名 | split -b 1000k -d - 输出文件 如有如下几个tar分卷&#xff1a;logs.tar.gza1、logs.tar.gza2、logs.tar.gza3&#xff0c;在Windows下如何进行合并呢&#xff…

【备战蓝桥杯系列】单源最短路径Dijkstra算法模板

Dijkstra算法模板 蓝桥杯中也是会考到图论最短路的&#xff0c;一旦考到&#xff0c;基本是不会太难的&#xff0c;只要知道板子就基本能拿分了。 两个板子如下 朴素Dijkstra算法 适应情况&#xff1a;稠密图&#xff0c;正权边 时间复杂度 O(n^2 m) int dijkst(){memse…

银河麒麟服务器ky10 server wvp镜像制作

在线安装docker yum install docker -y cat >/etc/docker/daemon.json<<EOF{"registry-mirrors": ["https://registry.docker-cn.com","https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com"]} EOF systemctl start …

php集成修改数据库的字段

1.界面效果 2.代码 <?phpecho <form action"" method"post"><label for"table">表名:</label><input type"text" id"table" name"table"><br><div id"fieldsContaine…

js【详解】async await

为什么要使用 async await async await 实现了使用同步的语法实现异步&#xff0c;不再需要借助回调函数&#xff0c;让代码更加易于理解和维护。 (async function () {// await 必须放在 async 函数中try {// 加载第一张图片const img1 await loadImg1()// 加载第二张图片co…

P1002 [NOIP2002 普及组] 过河卒

题目 原题目链接 题目描述 棋盘上 A A A 点有一个过河卒&#xff0c;需要走到目标 B B B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河…

比较两组二维平面结构的演化

假设1个6*6的二维平面空间&#xff0c;这个空间的行和列只能按照1-2-3-4-5-6-1的顺序变换。这个平面上的物体只能平移。在这个空间里有力&#xff0c;在这些力的作用下&#xff0c;两个点按照 1-7的顺序运动。 - - - - - - - - - - - - - - - A - - - - - …

序列化相关知识总结

目录 一、序列化1.1 基本概念1.1.1 序列化1.1.2 反序列化1.1.3 数据结构、对象与二进制串1.1.4 序列化/反序列化的目的 1.2 几种常见的序列化和反序列化协议1.2.1 XML&SOAP1.2.2 JSON&#xff08;Javascript Object Notation&#xff09;1.2.3 Protobuf 二、安卓下的序列化…

React 开发者完全指南:React.FC()、函数组件 和更多

前言 React.FC 是一个 TypeScript 类型&#xff0c;用于 React 函数组件。FC 代表 Functional Component&#xff08;函数组件&#xff09;。这个类型的使用有助于在 TypeScript 项目中编写类型安全的 React 组件。使用 React.FC 为组件定义类型就可以享受到 TypeScript 提供的…

什么是IP白名单?为什么要设置IP白名单?

在互联网的世界里&#xff0c;IP地址是每个设备与网络进行通信的关键标识。然而&#xff0c;并不是所有的IP地址都可以无限制地访问所有网络资源。为了保障网络安全和资源管理&#xff0c;很多网站和服务会设置IP白名单。本文将详细介绍IP白名单的定义、作用以及为什么要设置IP…

ARMv8/ARMv9架构入门到精通-学习方法

目录 1、学习ARM基础知识2、学习ARM异常(中断)3、学习MMU4、学习Cache5、学习Trustzone和安全架构6、学习ARM架构和各类IP推荐 本文转自 周贺贺&#xff0c;baron&#xff0c;代码改变世界ctw&#xff0c;Arm精选&#xff0c; 资深安全架构专家&#xff0c;11年手机安全/SOC底层…

SpringMVC06、数据处理

6、数据处理 6.1、处理提交数据 1、提交的域名称和处理方法的参数名一致 提交数据 : http://localhost:8080/hello?namekuangshen 处理方法 : RequestMapping("/hello") public String hello(String name){System.out.println(name);return "hello";…