宝塔Webhook: 轻松实现自动化部署

本文介绍的是使用宝塔Webhook实现自动化部署Springboot和vite项目。相比于jenkins,使用宝塔Webhook占用的内存空间小,在服务器资源紧张的情况下非常适合使用

1.安装宝塔 Webhook

2.私有仓库创建密钥

然后如果是私有项目的话就去终端输入cd ~/.ssh && ls查看密钥

如果没有的话就输入ssh-keygen -t rsa -C "your_email@example.com"来生成密钥,会让你输入三个东西,没有必要的话直接回车留空即可

然后输入 cat id_rsa.pub来查看证书内容,复制他,一会要去git中配置

接着去git仓库上(我这里用的是gitee)把ssh链接保存

3.添加 hook

去宝塔上点击配置、新增,把下面这个脚本配置进去,注意要把你的git项目和git链接更换成你自己的

这个脚本是部署springboot项目的,需要提前在服务器安装jdk,maven,git。 如果部署的是前端项目,只需要修改脚本,打包前端项目到nginx配置的资源存放的路径即可

bash 复制代码
 #!/bin/bash
     echo ""
 ​
     # 环境变量
     export JAVA_HOME="/www/server/java/jdk1.8.0_371"
     PATH=$PATH:$MVN/bin
     export $PATH
 ​
     export MVN="/opt/maven/bin"
     PATH=$PATH:$MVN
     export $PATH
 ​
 ​
     # 设置 MAVEN_HOME 环境变量
     export MAVEN_HOME="/opt/maven/bin"
 ​
     # 将 Maven 的 bin 目录添加到 PATH 环境变量中
     export PATH=$MAVEN_HOME:$PATH
 ​
 ​
     # 输出当前时间
     date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
     echo "Start"
     # 判断宝塔WebHook参数是否存在
     if [ ! -n "$1" ];
     then
               echo "param参数错误"
               echo "End"
               exit
     fi
     # git项目路径,这里设置你打算存放项目代码的文件路径
     gitPath="/www/wwwroot/BackEnd_dev1_cd"
     # git 网址, 这里设置里git仓库的地址
     gitHttp="git@gitee.com:xxxxx/xxxxxxxbackend.git"
 ​
     echo "Web站点路径:$gitPath"
 ​
     # 判断项目路径是否存在
     if [ -d "$gitPath" ]; then
             cd $gitPath
             # 判断是否存在git目录
             if [ ! -d "xxxxxxxbackend" ]; then
                     echo "在该目录下克隆 git"
                     git clone -b deploy $gitHttp 
             fi
 ​
         # 这里也需要修改成你项目代码的路径
             cd /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend
             
              echo "" >> nohup.out
              echo "" >> nohup.out
 ​
 ​
              echo "配置安全目录开始" >> nohup.out
 ​
 ​
              git config --global --add safe.directory /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
              chown -R $(whoami):$(whoami) /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
 ​
              echo "配置安全目录结束" >> nohup.out
 ​
             # 切换到 deploy 分支, 这里需要在你的项目建立deploy分支
             git checkout deploy
             
             
             # 获取当前分支名
             currentBranch=$(git rev-parse --abbrev-ref HEAD)
             echo "当前分支:$currentBranch"
 ​
             if [ "$currentBranch" != "deploy" ]; then
                 echo "当前分支不是 deploy,跳过更新操作"
                 echo "End"
                 exit
             fi
 ​
             # 检查远程是否有更新
             echo "检查远程更新..."
             git fetch origin deploy
             localHash=$(git rev-parse HEAD)
             remoteHash=$(git rev-parse origin/deploy)
 ​
             echo "本地提交哈希: $localHash"
             echo "远程提交哈希: $remoteHash"
 ​
             if [ "$localHash" == "$remoteHash" ]; then
                 echo "代码已是最新,无需更新"
                 echo "End"
                 exit
             fi
 ​
             
             
             
 ​
             # 设置目录权限
             chown -R www:www $gitPath
 ​
             cd ./target
 ​
             ps -ef | grep xxxxxxxbackend-1.0.0-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9 >> nohup.out 2>&1
 ​
                 # 检查是否在 target 目录
             if [[ $(basename $PWD) == "target" ]]; then
                 echo "当前在 target 目录,返回上一级目录"
                 cd ../
             fi
             
             
             echo "" >> nohup.out
              echo "" >> nohup.out
 ​
 ​
              echo "配置安全目录开始" >> nohup.out
 ​
 ​
              git config --global --add safe.directory /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
              chown -R $(whoami):$(whoami) /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
 ​
              echo "配置安全目录结束" >> nohup.out
 ​
 ​
 ​
              echo "重置git仓库状态为远程仓库的deploy开始" >> nohup.out
 ​
              # 拉取最新的项目文件
              git reset --hard origin/deploy >> nohup.out 2>&1
 ​
              echo "重置git仓库状态为远程仓库的deploy结束" >> nohup.out
 ​
 ​
              date --date='0 days ago' "+%Y-%m-%d %H:%M:%S" >> nohup.out
              echo "开始拉取代码..." >> nohup.out
              echo "执行 git pull..." >> nohup.out
              git pull >> nohup.out 2>&1
 ​
 ​
 ​
             mvn clean >> nohup.out 2>&1
 ​
             mvn install >> nohup.out 2>&1
 ​
             cd ./target
 ​
             # 运行新的 Java 程序
             nohup /www/server/java/jdk1.8.0_371/bin/java -jar xxxxxxxbackend-1.0.0-SNAPSHOT.jar >> nohup.out 2>&1 &
    
             echo "End"
             exit
     else
             echo "该项目路径不存在"
             echo "End"
             exit
     fi

查看密钥链接 和密钥 并且保存,一会要用

4.git 平台配置

这里我用gitee的仓库来做示例

首先进入你的仓库,然后点击管理->公钥管理->添加公钥 把刚刚的公钥配置进去 ps:标题默认是你密钥的邮箱,可以自定义

添加完成后会有一个可部署公钥

添加完成后点击webhook配置链接

配置好后去你要存放的目录中用ssh来克隆项目测试

5.设置分支

新建 deploy 分支,将 master 分支的 rebase 到 deploy 分支,并打出 jar 包,放到 deploy 目录中,并 push 到远端

6.看日志

最后去看日志,就会有最近的一次提交

在 nohup.out 文件中有项目运行的日志

参考: 宝塔使用webhook自动部署前言 大家在部署项目的时候是不是还是传到git中后去服务器pull,其实git大多数是有自 - 掘金

这里有非常多的坑,下面一一列举

1.Webhook 的 shell 找不到 Linux 环境变量的指令

在 Webhook 的 shell 中不能直接使用 mvn install 或 java -jar 这种命令,因为找不到命令,需要在 shell 中自行导入,导入了还可能不成功,可能还需要使用全类名指令

bash 复制代码
 #!/bin/bash
     echo ""
 ​
     # 环境变量
     export JAVA_HOME="/www/server/java/jdk1.8.0_371"
     PATH=$PATH:$MVN/bin
     export $PATH
 ​
     export MVN="/opt/maven/bin"
     PATH=$PATH:$MVN
     export $PATH
 ​
 ​
     # 设置 MAVEN_HOME 环境变量
     export MAVEN_HOME="/opt/maven/bin"
 ​
     # 将 Maven 的 bin 目录添加到 PATH 环境变量中
     export PATH=$MAVEN_HOME:$PATH
 ​
 ​
     # 输出当前时间
     date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
     echo "Start"
     # 判断宝塔WebHook参数是否存在
     if [ ! -n "$1" ];
     then
               echo "param参数错误"
               echo "End"
               exit
     fi
     # git项目路径,这里设置你打算存放项目代码的文件路径
     gitPath="/www/wwwroot/BackEnd_dev1_cd"
     # git 网址, 这里设置里git仓库的地址
     gitHttp="git@gitee.com:xxxxx/xxxxxxxbackend.git"
 ​
     echo "Web站点路径:$gitPath"
 ​
     # 判断项目路径是否存在
     if [ -d "$gitPath" ]; then
             cd $gitPath
             # 判断是否存在git目录
             if [ ! -d "xxxxxxxbackend" ]; then
                     echo "在该目录下克隆 git"
                     git clone -b deploy $gitHttp 
             fi
 ​
         # 这里也需要修改成你项目代码的路径
             cd /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend
             
              echo "" >> nohup.out
              echo "" >> nohup.out
 ​
 ​
              echo "配置安全目录开始" >> nohup.out
 ​
 ​
              git config --global --add safe.directory /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
              chown -R $(whoami):$(whoami) /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
 ​
              echo "配置安全目录结束" >> nohup.out
 ​
             # 切换到 deploy 分支, 这里需要在你的项目建立deploy分支
             git checkout deploy
             
             
             # 获取当前分支名
             currentBranch=$(git rev-parse --abbrev-ref HEAD)
             echo "当前分支:$currentBranch"
 ​
             if [ "$currentBranch" != "deploy" ]; then
                 echo "当前分支不是 deploy,跳过更新操作"
                 echo "End"
                 exit
             fi
 ​
             # 检查远程是否有更新
             echo "检查远程更新..."
             git fetch origin deploy
             localHash=$(git rev-parse HEAD)
             remoteHash=$(git rev-parse origin/deploy)
 ​
             echo "本地提交哈希: $localHash"
             echo "远程提交哈希: $remoteHash"
 ​
             if [ "$localHash" == "$remoteHash" ]; then
                 echo "代码已是最新,无需更新"
                 echo "End"
                 exit
             fi
 ​
             
             
             
 ​
             # 设置目录权限
             chown -R www:www $gitPath
 ​
             cd ./target
 ​
             ps -ef | grep xxxxxxxbackend-1.0.0-SNAPSHOT.jar | grep -v grep | awk '{print $2}' | xargs kill -9 >> nohup.out 2>&1
 ​
                 # 检查是否在 target 目录
             if [[ $(basename $PWD) == "target" ]]; then
                 echo "当前在 target 目录,返回上一级目录"
                 cd ../
             fi
             
             
             echo "" >> nohup.out
              echo "" >> nohup.out
 ​
 ​
              echo "配置安全目录开始" >> nohup.out
 ​
 ​
              git config --global --add safe.directory /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
              chown -R $(whoami):$(whoami) /www/wwwroot/BackEnd_dev1_cd/xxxxxxxbackend >> nohup.out
 ​
 ​
              echo "配置安全目录结束" >> nohup.out
 ​
 ​
 ​
              echo "重置git仓库状态为远程仓库的deploy开始" >> nohup.out
 ​
              # 拉取最新的项目文件
              git reset --hard origin/deploy >> nohup.out 2>&1
 ​
              echo "重置git仓库状态为远程仓库的deploy结束" >> nohup.out
 ​
 ​
              date --date='0 days ago' "+%Y-%m-%d %H:%M:%S" >> nohup.out
              echo "开始拉取代码..." >> nohup.out
              echo "执行 git pull..." >> nohup.out
              git pull >> nohup.out 2>&1
 ​
 ​
 ​
             mvn clean >> nohup.out 2>&1
 ​
             mvn install >> nohup.out 2>&1
 ​
             cd ./target
 ​
             # 运行新的 Java 程序
             nohup /www/server/java/jdk1.8.0_371/bin/java -jar xxxxxxxbackend-1.0.0-SNAPSHOT.jar >> nohup.out 2>&1 &
    
             echo "End"
             exit
     else
             echo "该项目路径不存在"
             echo "End"
             exit
     fi

上面这段代码的前面使用 export 导入了环境变量,导入了环境变量可能还不够,在最后还使用了 java 指令的全路径执行命令。

这里还需要特别注意的是JAVA_HOME 是不需要/bin 的,只需要 java 的安装目录,而加入全局环境变量的PATH 是需要加上/bin 的。

这里还要使用中终端使用 which java , which mvn 找到这些指令的位置。

参考:关于 Webhook 部分指令无法运作的解决方案

www.bt.cn/bbs/thread-...

2.git pull 拉取失败,需要设置安全目录

上面的代码中设置了 git config --global --add safe.directory /www/wwwroot/BackEnd_dev1_cd/Comprehensive.Data.Management.Platform.BackEnd >> nohup.out 用于设置 git 安全目录。有时这个还不够,还需要设置 chown -R $(whoami):$(whoami) /www/wwwroot/BackEnd_dev1_cd/Comprehensive.Data.Management.Platform.BackEnd >> nohup.out将当前目录设置给这个用户。

3.maven 不要使用 yum 安装,有 bug

使用 yum 安装的 maven 不全,无法执行命令,使用 wget 下载安装包手动安装。

参考: maven 安装

总结

要经常使用 echo "xxxxx" >> nohup.out 2>&1 ,mvn install >> nohup.out 2>&1 将输出结果输出到日志中,方便观察哪里发生错误。

>> 用于将命令的输出追加到指定的文件中 。

2>&1

  • 2> 是重定向标准错误输出(stderr)的方式。2 是指标准错误输出,> 是重定向操作符。
  • &1 的意思是将标准错误输出(2)重定向到标准输出(1)的位置。也就是说,把标准错误输出流合并到标准输出流。
  • 因此,2>&1 的作用是将标准错误输出重定向到标准输出,并且标准输出将会重定向到 nohup.out 文件中。
相关推荐
一只叫煤球的猫4 分钟前
🕰 一个案例带你彻底搞懂延迟双删
java·后端·面试
冒泡的肥皂15 分钟前
MVCC初学demo(一
数据库·后端·mysql
颜如玉1 小时前
ElasticSearch关键参数备忘
后端·elasticsearch·搜索引擎
卡拉叽里呱啦2 小时前
缓存-变更事件捕捉、更新策略、本地缓存和热key问题
分布式·后端·缓存
David爱编程2 小时前
线程调度策略详解:时间片轮转 vs 优先级机制,面试常考!
java·后端
码事漫谈3 小时前
C++继承中的虚函数机制:从单继承到多继承的深度解析
后端
阿冲Runner3 小时前
创建一个生产可用的线程池
java·后端
写bug写bug3 小时前
你真的会用枚举吗
java·后端·设计模式
喵手4 小时前
如何利用Java的Stream API提高代码的简洁度和效率?
java·后端·java ee
掘金码甲哥4 小时前
全网最全的跨域资源共享CORS方案分析
后端