目录
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 &"'
}
}
}
}