分享一篇Jenkins自动化部署脚本

分享一篇Jenkins自动化部署脚本

一、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;
    }

本文由 在码圈 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!
原文链接:https://bedebug.com/archives/jenkins-scripts
最后更新于:2021-04-16 18:32:50

请博主喝咖啡 ☕.