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
do
	ssh root@$ip "ls $workdir"
	if [ $? -ne 0 ];then
		ssh root@$ip "mkdir -p $workdir/{log,backup}"
		echo -e "\033[32m$ip /app create sucessful!!!\e[0m"
	else
		echo -e "\033[33m$ip /app is exist!!!\e[0m"
	fi
  
	if [ -f $jardir$jar ];then
		ssh root@$ip "rm -rf $workdir/backup/*"
		ssh root@$ip "mv $workdir/*.jar $workdir/backup"
		scp $jardir$jar root@$ip:$workdir

    # 是否需要下载java
		ssh root@$ip "which java &> /dev/null " 
		if [ $? -ne 0 ];then
			ssh 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 ];then
			ssh root@$ip "kill $ryprocess"
		fi
		ssh 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.log

chmod +x test.sh

配置 Jenkins 调用脚本

使用参数构建

5、配置参数化构建项目
修改 maven-deploy.sh 脚本
#!/bin/bash
#author: lemonZ
#description: deploy/rollback ruoyi
#date: 2022年9月11日 18:59:49

version=$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 ];then
		echo "创建$workdir"
		ssh root@$1 "mkdir -p $workdir/{$2,backup}"
	else
		echo "清空$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 ];then
		mkdir -p  $workdir
	fi
	cd $jardir
	tar -zcf $workdir/$tar_name $jar
}

#scp jar包到远程目录
scp_java(){
	scp $workdir/$2 root@$1:$workdir/backup
}

#本地分发目录和远程备份目录每个版本保留3个备份
rm_backup(){
	echo $workdir
	cd $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=1
	for i in $backup_file
	do
		while [ $num -gt $backup_num ]
		do
				ssh root@$1 "rm -rf /javaapp/ruoyi/backup/$i"
				echo "删除$i"
				break
		done
		let num++
	done

}
#远程主机安装jdk11
install_java11(){
	ssh root@$1 "which java &> /dev/null"
	if [ $? -ne 0 ];then
			ssh 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" ];then
			ssh root@$1 kill "$ryprocess"
	fi
	
	ssh 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 $iplist
	do
		check_workdir $ip $target_version
		cp_java 
		scp_java $ip $tar_name 
		install_java11 $ip
		start_java $ip $tar_name $target_version
		rm_backup $ip
	done
}

#回滚策略,根据版本回滚到上一次构建
rollback(){
	last_version=$(ls $workdir | sort -r | sed -n '2p' | awk -F "-" '{print $3}')
	if [ $version == $last_version ];then
		rollback_version_tar=$(ls $workdir | grep $version | sort -r | sed -n "2p")
	else
		rollback_version_tar=$(ls $workdir | grep $version | sort -r | sed -n "1p")
	fi
	rollback_version=$(basename -s .tar.gz $rollback_version_tar)
	for ip in $iplist
        do
		ls $workdir | grep $version &> /dev/null
		if [ $? -eq 0 ];then
			ssh root@$ip ls $workdir/backup/$rollback_version_tar
			if [ $? -eq 0 ];then
				check_workdir $ip $rollback_version
				start_java $ip $rollback_version_tar $rollback_version
			else
				check_workdir $ip $rollback_version
				install_java11 $ip
				scp_java $ip $rollback_version_tar		
				start_java $ip $rollback_version_tar $rollback_version
			fi
		else
			deploy
		fi		
	done
}

case $1 in
	deploy)
		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 any
    tools {
        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 &"'
            }
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux:kubernetes(k8s)探针的简介(7)

相当于我们用于监控容器的一个东西&#xff0c;通过给我们的不同探针来判断容器内的状态情况&#xff0c;实现故障的一个自动恢复。 我们在上一章的yaml文件中写入了一个这个东西 那么他什么情况下重启&#xff0c;就是通过探针进行一个监控&#xff0c;加入监控某一个端口&…

element多选框select下拉框数据回显的问题value.push is not a function

文章目录 问题描述 问题描述 今天在使用Element UI el-select组件遇到了一个问题&#xff0c;如下图&#xff1a; 下拉框里的值选中了&#xff0c;但是文本框里没有值 这是 el-select组件代码,我这里是用了一个多选框&#xff0c;options的值是在后端查询的&#xff0c;form.we…

利用MATLAB模拟点电荷的电场分布

一、实验目的&#xff1a; 1&#xff0e;熟悉点电荷的电场分布情况&#xff1b; 2&#xff0e;学会使用Matlab绘图&#xff1b; 二、实验内容&#xff1a; 1&#xff0e;根据库伦定律&#xff0c;利用Matlab强大的绘图功能画出单个点电荷的电场分布情况&#xff0c;包括电力…

虚拟化之内存(Memory)

一 内存的查看方式 free -k/m/h cat /proc/meminfodmesg |grep memory free命令的实质是根据meminfo中的文件来提取信息 二 内存虚拟化 1.概念&#xff1a;由于物理MMU只能通过Host机的物理地址进行寻址&#xff0c;所以实现内存虚拟化&#xff0c;关键是需要将Guest机的…

⭐每天一道leetcode:58.最后一个单词的长度(简单;istringstream;遍历查看)

⭐今日份题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例1 输入&#xff1a;s "Hello World" 输出&#xff1a…

Ubuntu将c++编译成.so文件并测试

一、准备cpp和h文件 创建test.cpp 在cpp中定义相加的函数funcAdd&#xff0c;给出函数的细节代码 #include <iostream> using namespace std;int funcAdd(int x, int y) {return xy; }创建test.h 在h中声明定义的函数&#xff0c;不需要任何细节 #ifndef __TEST__ #…

Catf1agCTF-Web通关合集

本文相关的ctf平台链接&#xff1a;Catf1agCTF - 综合训练平台 WEB签到 查看源代码 flag倒叙了&#xff0c;可以使用下面这个 文本字符串倒序在线工具(ESJSON在线工具) flag&#xff1a; catf1ag{welcome_to_catf1agctf_!!!_gogogo_!!!} flag在哪呢&#xff1f; 查看源代…

1、MQ_介绍、优缺点、类型等

MQ介绍 1. MQ概述 MQ&#xff08;Message Queue&#xff09;&#xff1a;消息队列&#xff0c;是基础数据结构中FIFO&#xff08;first in first out&#xff09;的一种数据结构。一般用来解决流量削峰、应用解耦、异步处理等问题&#xff0c;实现高性能&#xff0c;高可用&a…

Error:java:JDK isn‘t specified for module “模块名称“

可能是创建模块后不小心删掉了.idea.或.idea出错 只要删除.idea&#xff0c;close project出去&#xff0c;重新进让idea自动下载

FL Studio2024中文正式版水果编曲软件(支持苹果M1处理器)

FL Studio 2024是一款功能强大的数字音频工作站&#xff0c;它具有多种功能和特点&#xff0c;使得音乐制作变得更加简单、高效和有趣。 首先&#xff0c;它支持多轨录音和编辑&#xff0c;用户可以同时处理多个音频轨道&#xff0c;进行复杂的音乐编排和混音。此外&#xff0…

蜘蛛池是什么意思,怎么生成蜘蛛池

蜘蛛池是由自然界中的蜘蛛群落构成的一个小生态系统&#xff0c;也是身处自然界中的游客们可以在风雨中体验到最贴近自然气息的地方。 点开我主页面 Baidu蜘蛛的作用&#xff1a; 引蜘蛛逐渐收录&#xff0c;降权引蜘蛛可以疗伤&#xff0c;排名/收录不稳定&#xff0c;没有收…

基于springboot+vue的善筹网众筹网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Linux 开发工具 yum、git、gdb

目录 一、yum 1、软件包 2、rzsz 3、注意事项 4、查看软件包 5、安装软件 6、卸载软件 二、git操作 1、克隆三板斧 2、第一次使用会出现以下情况&#xff1a; 未配置用户名和邮箱&#xff1a; push后弹出提示 三、gdb使用 1、背景 2、使用方法 例一&#xff1a…

数据库:2024/3/6

作业1&#xff1a;使用C语言完成数据库的增删改 代码&#xff1a; #include <myhead.h>//定义添加员工信息函数 int Add_worker(sqlite3 *ppDb) {//准备sql语句printf("请输入要添加的员工信息:\n");//从终端获取员工信息char rbuf[128]"";fgets(r…

阿里云2核2G服务器多少钱?99元一年,轻量云是61元一年

阿里云2核2G服务器多少钱&#xff1f;99元一年&#xff0c;轻量云服务器是61元一年。2核2G服务器性能如何&#xff1f;性能很不错&#xff0c;不限制CPU性能&#xff0c;99元2核2G服务器是ECS经济型e实例&#xff0c;61元2核2G服务器是轻量应用服务器&#xff0c;都是3M公网带宽…

Facial Micro-Expressions:An Overview 阅读笔记

Proceedings of the IEEE上一篇微表情相关的综述&#xff0c;写的很详细。从心理学与计算机两个领域阐述了微表情生成的原因与相关算法&#xff0c;值得仔细研读。 摘要&#xff1a; Four main tasks in ME analysis arespecifically discussed,including ME spotting,ME recog…

【MySQL】数据库设计

目录 数据库设计基本任务 软件项目开发周期中数据库设计数据库设计的基本步骤解释需求分析需求分析的三个步骤&#xff1a;1.需求调查:2.分析数据字典内容定义数据的方法案例 3. 评审 概念结构设计概念模型概念结构设计E-R图概念模型组成元素&#xff1a;关系解释案例分析 逻辑…

获得店铺的所有商品API接口

使用淘宝淘口令接口的步骤通常包括&#xff1a; 注册成为淘宝开放平台的开发者&#xff1a;在淘宝开放平台网站上注册账号并完成认证。 创建应用以获取API密钥&#xff1a;在您的开发者控制台中创建一个应用&#xff0c;并获取用于API调用的密钥&#xff0c;如Client ID和Clie…

【QT】鼠标事件<QMouseEvent>

事件&#xff08;鼠标事件&#xff09; 功能单一的事件&#xff0c;鼠标进来是一个事件&#xff0c;鼠标出去是另外一个事件。 QT提供了很多的事件函数&#xff0c;我们通过重写这些事件函数就可以实现我们想要的效果。 事件函数都是虚函数 写一个子类&#xff0c;继承QLab…