目录
[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 主机)
[修改 maven-deploy.sh 脚本](#修改 maven-deploy.sh 脚本)
[配置 Jenkins 构建后执行该脚本](#配置 Jenkins 构建后执行该脚本)
[创建 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 &"'
}
}
}
}


