Jenkins 部署 RuoYi

目录

1、项目介绍

2、部署若依

[clone 源代码](#clone 源代码)

[导入数据库到 node-16](#导入数据库到 node-16)

[修改 RuoYi 配置文件](#修改 RuoYi 配置文件)

[推送 RuoYi 项目至 Gitlab](#推送 RuoYi 项目至 Gitlab)

[3、配置 Jenkins](#3、配置 Jenkins)

[配置本地 Maven](#配置本地 Maven)

[Jenkins 配置 Maven](#Jenkins 配置 Maven)

[新建 Maven 项目](#新建 Maven 项目)

编写构建后的脚本

[Jenkins 构建后执行脚本](#Jenkins 构建后执行脚本)

[4、Jenkins 传递参数](#4、Jenkins 传递参数)

设置项目部署动作

[Jenkins 获取 git 标签](#Jenkins 获取 git 标签)

[Jenkins 设置主机参数](#Jenkins 设置主机参数)

[配置 javagroup 主机](#配置 javagroup 主机)

测试参数

5、配置参数化构建项目

[修改 maven-deploy.sh 脚本](#修改 maven-deploy.sh 脚本)

测试脚本

[配置 Jenkins 构建后执行该脚本](#配置 Jenkins 构建后执行该脚本)

测试回滚

6、Pipeline

概念介绍

[创建 ruoyi-pipline 并构建测试](#创建 ruoyi-pipline 并构建测试)

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

[修改 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 [email protected] ./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 [email protected] ./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: '[email protected]:lemon/ruoyi.git'
修改 pipline 工作脚本
复制代码
node {
  stage("clone 代码"){
    git credentialsId: '81283712-9db6-4f33-95f1-be6bc79712c4', url: '[email protected]: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: '[email protected]:lemon/ruoyi.git'
            }
        }
        stage("代码构建"){
            steps {
            sh 'cd /var/lib/jenkins/workspace/ruoyi-pipline && mvn clean install'
            }
        }
        stage("代码拷贝"){
            steps {
                sh 'sudo ssh [email protected] 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 [email protected] 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 [email protected] yum install -y java-11-openjdk'  
            }
        }
        stage('杀死若依进程'){
            steps {
                sh 'sudo ssh [email protected] "ps -ef | grep ruoyi | grep -v grep | awk \'{print $2}\' | xargs rm -rf {} ||  true "'
            }
        }
        stage('启动服务'){
            steps {
                sh 'sudo ssh [email protected] "nohup java -jar /javaapp/ruoyi-pipline/ruoyi-admin.jar &"'
            }
        }
    }
}
相关推荐
L汐15 分钟前
07 负载均衡
运维·nginx·负载均衡
pjx98719 分钟前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
牛奔20 分钟前
Docker配置远程连接
运维·docker·云原生·容器·eureka
VR最前沿1 小时前
构建集成差异化灵巧手和先进机器人控制技术的自动化系统
运维·机器人·自动化
蟑螂恶霸1 小时前
解决ubuntu20中tracker占用过多cpu,引起的风扇狂转
linux·运维·ubuntu
1024小神2 小时前
tauri2项目使用sidcar嵌入可执行文件并使用命令行调用
linux·运维·服务器
AI风老师2 小时前
2、ubuntu系统配置OpenSSH | 使用vscode或pycharm远程连接
linux·运维·服务器·ssh
枫叶落雨2222 小时前
下载的旧版的jenkins,为什么没有旧版的插件
运维·jenkins
PatrickYao04223 小时前
想要建站但没有服务器?雨云RCA,免服务器即可搭建完整网站!!!
运维·服务器·alist·云应用·无服务器部署
独行soc3 小时前
2025年渗透测试面试题总结-百度面经(题目+回答)
运维·开发语言·经验分享·学习·面试·渗透测试·php