一、Java发布脚本
0. Hosts 文件
[server_release]
xxx.xxx.xxx.xxx user=xxx
[server_beta]
xxx.xxx.xxx.xxx user=xxx
[server_dev]
xxx.xxx.xxx.xxx user=xxx
1. Jenkins Java发布执行计划
#BUILD_ID=DONTKILLME
#!/bin/bash
# Git代码地址
gitPath=项目地址
# 工作目录
workPath=/xxx/workspace
# 代码目录名称
codeName=如xxx-job
# 部署服务器
server=server_dev
# Ansible Yaml 地址
ansibleYamlPath=/opt/ansible/yaml/deploy-backend.yaml
# Ansible Hosts 地址
ansibleHostsPath=/opt/ansible/host/hosts
# 参数
javaArgs="--spring.profiles.active=dev-Xmx2048m -Xms2048m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Djava.security.egd=file:/dev/urandom"
# ---------------------------------------------
# 进入当前目录
cd $workPath
# 如果当前没有这个文件夹 则需要 重新拉取
if [ ! -d "$workPath/$codeName/" ];then
# 输出日志
echo ""
echo "1. 克隆远端服务代码"
echo ""
git clone $gitPath
cd $codeName
else
# 如果有 则需要 拉取一下最新代码
# 输出日志
echo ""
echo "1. 更新远端服务代码"
echo ""
cd $codeName
git pull
fi
echo ""
echo "2. 打包中......"
echo ""
# 打包 先clean 再package(如果不clean 有可能打包会丢文件)
mvn clean package
# 更改文件名称
find $workPath/${codeName}/opsli-modules/target -type f -regex ".*\.\(jar\)" | xargs -i mv {} $workPath/${codeName}/opsli-modules/target/$codeName.jar
echo ""
echo "3. 发送到远端服务器并执行远程脚本操作"
echo ""
# 发送到远端服务器 并 启动'
ansible-playbook $ansibleYamlPath -i $ansibleHostsPath -e "{'server':'${server}', 'codeName': '${codeName}', 'javaArgs': '${javaArgs}'}"
2. Jenkins Java发布服务器 (通用)
- hosts: "{{server}}"
remote_user: "{{user}}"
tasks:
- name: 拷贝Jar
tags: copy_code
copy: src="/opt/workspace/{{codeName}}/opsli-modules/target/{{codeName}}.jar" dest="~/opsli/upload/java"
- name: 备份代码并启动项目
tags: back_code
shell: |
sh ~/opsli/shells/deploy-backend.sh {{codeName}}
- name: 启动项目
tags: startup_project
shell: |
cd ~/opsli/workspace/java/{{codeName}}
nohup java -jar {{codeName}}.jar {{javaArgs}} >/dev/null 2>&1 &
3. 测试服务器 - Java后端脚本 (通用)
#!/bin/bash
# 文件名称
fileName=$1.jar
# 当前时间
currTime=$(date "+%Y%m%d%H%M%S")
# 当前用户名
userName=${USER}
# 家目录
homePath=${HOME}
# 工程目录前缀
jobPrefix=opsli
# 上传文件目录
uploadFilePath=$homePath/$jobPrefix/upload/java
# 工作目录
workPath=$homePath/$jobPrefix/workspace/java/$1
# 备份目录
backPath=$homePath/$jobPrefix/back/java/$1
########################################################
# 判断 文件夹是否存在 不存在则直接创建
if [ ! -d "$uploadFilePath/" ];then
mkdir -p $uploadFilePath
fi
if [ ! -d "$workPath/" ];then
mkdir -p $workPath
fi
if [ ! -d "$backPath/" ];then
mkdir -p $backPath
fi
#判断文件是否存在
if [ ! -f "$uploadFilePath/$fileName" ];then
echo "错误信息: 文件不存在,请重新拷贝执行"
exit 1
fi
# 杀死当前 java 进程
PROCESS=`ps -ef | grep $fileName | grep -v grep | grep -v PPID | awk '{ print $2}' `
for i in $PROCESS
do
echo "Kill the $1 process [ $i ]"
kill -9 $i
done
# 备份文件
cd $backPath
mkdir -p $backPath/$currTime
cp -r $workPath $backPath/$currTime
rm -rf $workPath/*.jar
# 只保留最新的5次备份
ls -l|wc -l|awk '{print $0}'|while read count;do while(( $count > 5));do OldFile=$(ls -rt | head -1);echo "Delete File:"$OldFile;rm -rf "$OldFile";let "count--";done;done
# 移动上传文件 当工作目录下
mv $uploadFilePath/$fileName $workPath
二、Vue发布脚本
1. Jenkins Vue发布执行计划
#!/bin/sh -l
# Git代码地址
gitPath=Git项目地址
# 工作目录
workPath=/opt/workspace
# 代码目录名称
codeName=如xxx-job
# 部署服务器
server=server_dev
# Ansible Yaml 地址
ansibleYamlPath=/opt/ansible/yaml/deploy-frontend.yaml
# Ansible Hosts 地址
ansibleHostsPath=/opt/ansible/host/hosts
# ---------------------------------------------
# 进入当前目录
cd $workPath
# 如果当前没有这个文件夹 则需要 重新拉取
if [ ! -d "$workPath/$codeName/" ];then
# 输出日志
echo ""
echo "1. 克隆远端服务代码"
echo ""
git clone $gitPath
cd $codeName
else
# 如果有 则需要 拉取一下最新代码
# 输出日志
echo ""
echo "1. 更新远端服务代码"
echo ""
cd $codeName
git pull
fi
nodeVersion=`node -v`
echo ""
echo "2. 打包中(Node 版本$nodeVersion)......"
echo ""
# 防止压缩图片功能找不到
#cnpm i image-webpack-loader -D
# 更新Node包并 执行打包命令
yarn && yarn build
# 压缩 dist 代码为 tar包
tar -zcvf $codeName.tar.gz ./dist
echo ""
echo "3. 发送到远端服务器并执行远程脚本操作"
echo ""
# 发送到远端服务器 并 启动
ansible-playbook $ansibleYamlPath -i $ansibleHostsPath -e "{'server':'${server}', 'codeName':'${codeName}'}"
2. Jenkins Vue发布服务器 (通用)
- hosts: "{{server}}"
remote_user: "{{user}}"
tasks:
- name: 拷贝 Dist
tags: copy_code
copy: src="/opt/workspace/{{codeName}}/{{codeName}}.tar.gz" dest="~/opsli/upload/vue"
- name: 备份代码并且部署
tags: back_build_code
shell: |
sh ~/opsli/shells/deploy-frontend.sh {{codeName}}
3. 测试服务器 - Vue前端脚本 (通用)
#!/bin/bash
# 文件名称
fileName=$1.tar.gz
# 当前时间
currTime=$(date "+%Y%m%d%H%M%S")
# 当前用户名
userName=${USER}
# 家目录
homePath=${HOME}
# 工程目录前缀
jobPrefix=opsli
# 上传文件目录
uploadFilePath=$homePath/$jobPrefix/upload/vue
# 工作目录
workPath=$homePath/$jobPrefix/workspace/vue/$1
# 备份目录
backPath=$homePath/$jobPrefix/back/vue/$1
########################################################
# 判断 文件夹是否存在 不存在则直接创建
if [ ! -d "$uploadFilePath/" ];then
mkdir -p $uploadFilePath
fi
if [ ! -d "$workPath/" ];then
mkdir -p $workPath
fi
if [ ! -d "$backPath/" ];then
mkdir -p $backPath
fi
#判断文件是否存在
if [ ! -f "$uploadFilePath/$fileName" ];then
echo "错误信息: 文件不存在,请重新拷贝执行"
exit 1
fi
# 备份文件
cd $backPath
mkdir -p $backPath/$currTime
cp -r $workPath $backPath/$currTime
rm -rf $workPath/*
# 只保留最新的5次备份
ls -l|wc -l|awk '{print $0}'|while read count;do while(( $count > 5));do OldFile=$(ls -rt | head -1);echo "Delete File:"$OldFile;rm -rf "$OldFile";let "count--";done;done
# 解压文件
tar -zxvf $uploadFilePath/$fileName -C $workPath
mv $workPath/dist/* $workPath
4. 测试服务器 - Vue前端Nginx配置
# 静态资源
location / {
root 代码路径;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
# 前端代理
location ^~ /opsli-boot {
proxy_pass http://后端IP:端口;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials: true;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS,PUT,DELETE;
}