使用宝塔面板的WebHook同步gitLab远程仓库里的git代码

背景与需求

你有没有遇到过,一套代码部署到多个服务器,当有更新的时候,需要多次更新代码?
每次的更新由于细节比较多,导致各个项目的代码不同步,管理变得困难和混乱?

比如一套系统,部署在两个或更多服务器上。
当我们修改某些内容的时候,希望这些服务器都能自动同步这些更新。
如何去实现呢?

分析

首先去百度,搜索相关的内容。
答案是五花八门。

经过查询,得到两种同步代码的方案。
一种是建立git镜像。
另一种,就是实现webhook。

Webhook是一个API概念,并且变得越来越流行。我们能用事件描述的事物越多,webhook的作用范围也就越大。
Webhook作为一个轻量的事件处理应用,正变得越来越有用。 准确的说webhook是一种web回调或者http的push API,是向APP或者其他应用提供实时信息的一种方式。
Webhook在数据产生时立即发送数据,也就是你能实时收到数据。这一种不同于典型的API,需要用了实时性需要足够快的轮询。这无论是对生产还是对消费者都是高效的,唯一的缺点是初始建立困难。
Webhook有时也被称为反向API,因为他提供了API规则,你需要设计要使用的API。Webhook将向你的应用发起http请求,典型的是post请求,应用程序由请求驱动。

上面这段话,其实不太好理解。那么飞云来换一种方式表达:
要想实现开头的需求,就要在远程git仓库,建立一个钩子。
当你在本地提交代码的时候,仓库自动启动这个钩子。让钩子,去自动同步代码到其他服务器。
具体是如何操作的呢?

创建欲同步的目录

在宝塔的/www/wwwroot/目录下,创建一个ros目录。
后面我们要将git仓库的文件,同步到这个目录里。
在实际应用中,你可以将git仓库的文件,同步到你的项目目录里。

file

宝塔webhook简介

宝塔的应用商店里,提供了webhook插件。

file

宝塔webhook使用

添加一个HOOK脚本,名字随便取。
脚本的内容,比较关键。

百度上搜到的资料,坑特别多。
我来列举两个:

#!/bin/bash
echo ""
echo "-----开始-----"
#服务器git项目路径
gitPath="/www/wwwroot/服务器git项目路径/"
#码云git项目网址 一定要ssh
gitHttp="码云git项目网址 ssh"
if [ -d "$gitPath" ]; then
  cd $gitPath
  #判断是否存在git目录
  if [ ! -d ".git" ]; then
    echo "在该目录下克隆git"
    git clone $gitHttp gittemp
    mv gittemp/.git .
    rm -rf gittemp
  fi
  #拉取最新的项目文件
  git reset --hard origin/master
  git pull origin master
  echo "拉取完成"
  #设置目录权限
  chown -R www:www $gitPath
  echo "-----结束-----"
  exit
else
  echo "该项目路径不存在"
  echo "End"
  exit
fi

再来列举一个:

#!/bin/bash
echo ""
# 输出当前时间
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/$1"
# git 网址
gitHttp="http://git.xxxxx.com/$1.git"

echo "Web站点路径:$gitPath"

# 判断项目路径是否存在
if [ -d "$gitPath" ]; then
        cd $gitPath
        # 判断是否存在git目录
        if [ ! -d ".git" ]; then
                echo "在该目录下克隆 git"
                git clone $gitHttp gittemp
                mv gittemp/.git .
                rm -rf gittemp
        fi
        # 拉取最新的项目文件
        git reset --hard origin/master
        git pull
        # 设置目录权限
        chown -R www:www $gitPath
        echo "End"
        exit
else
        echo "该项目路径不存在"
        echo "End"
        exit
fi

第一个,压根不能用。
第二个,代码比第一个规范。但是调用后,要么报错,要么同步的内容是空的。

怎么办呢?
自己改代码吧!
经过对第二个代码的修改,测试可以正常同步代码。

这个HOOK大致的作用,就是写一个shell脚本。
这个脚本提供了一个http地址,可供外部访问。

例如,我们将代码提交到远程git仓库,仓库就可以触发hook,进而执行这个宝塔的hook脚本。
只需要在脚本里,编写拉取仓库代码的逻辑,就可以实现文件同步了。

下面创建一个HOOK脚本,这个脚本会自动生成一个http地址。供gitLab创建钩子时使用。
file

创建gitLab钩子

再来看gitLab仓库里,如何建立hook钩子。

先创建一个新的仓库,作为测试使用。
仓库名为ros,访问权限为公开

进入仓库,在仓库的左侧菜单,进入webhooks
file

这里可以将仓库的一些事件,绑定hook钩子。

file

在宝塔的webHook中,查看刚创建的HOOK脚本密匙:
file

复制其中的http地址。

注意:http地址的尾部,携带了param参数。参数的值,是新建仓库的名字!
前面我们创建的仓库名,是ros
所以http地址的结尾,应该是param=ros
这里一定要搞清楚。

  • URL:填写宝塔中,hook钩子的web地址,注意结尾的param参数
  • Secret 令牌:填写宝塔中hook钩子的密钥
  • 钩子触发的来源,设置为推送事件。你也可以根据需求选其他的选项
  • SSL验证:不启用

file

设置好以后,保存这个HOOK钩子。
接下来,可以进入测试环节。

点击页面上的测试按钮,如果返回错误,说明配置不正确。
返回200,说明配置是正确的。
但是返回200,实际上不一定就能推送成功,要看hook脚本编写的是否正确。

file

测试

进入仓库,手动创建一个新文件,提交更改

file

查看宝塔中,webHook的运行日志

file

进入服务器上的ros目录,查看更新。
可以看到,ros目录下,已经从原来的空目录,变成了拥有三个文件/文件夹的目录。

file

总结

整个执行过程,是这样的:
1、先在本地开发。然后将代码,提交到gitlab仓库。
2、仓库的钩子,会自动访问宝塔中的脚本。
3、脚本里,会自动将git仓库的代码,拉取到本地的指定目录,实现文件同步

这样,就实现了:开发和维护一套代码,就可以将代码从git仓库,自动同步到不同的项目服务器里。
需要注意的是,只有公开项目,可以这样同步。
私有项目,还需要配置公钥。

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520飞云脚本圈
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 使用宝塔面板的WebHook同步gitLab远程仓库里的git代码

企业级大数据智能营销管理系统

了解详情