背景与需求
你有没有遇到过,一套代码部署到多个服务器,当有更新的时候,需要多次更新代码?
每次的更新由于细节比较多,导致各个项目的代码不同步,管理变得困难和混乱?
比如一套系统,部署在两个或更多服务器上。
当我们修改某些内容的时候,希望这些服务器都能自动同步这些更新。
如何去实现呢?
分析
首先去百度,搜索相关的内容。
答案是五花八门。
经过查询,得到两种同步代码的方案。
一种是建立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仓库的文件,同步到你的项目目录里。
宝塔webhook简介
宝塔的应用商店里,提供了webhook插件。
宝塔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创建钩子时使用。
创建gitLab钩子
再来看gitLab仓库里,如何建立hook钩子。
先创建一个新的仓库,作为测试使用。
仓库名为ros
,访问权限为公开
进入仓库,在仓库的左侧菜单,进入webhooks
这里可以将仓库的一些事件,绑定hook钩子。
在宝塔的webHook中,查看刚创建的HOOK脚本密匙:
复制其中的http地址。
注意:http地址的尾部,携带了param参数。参数的值,是新建仓库的名字!
前面我们创建的仓库名,是ros
所以http地址的结尾,应该是param=ros
这里一定要搞清楚。
- URL:填写宝塔中,hook钩子的web地址,注意结尾的param参数
- Secret 令牌:填写宝塔中hook钩子的密钥
- 钩子触发的来源,设置为推送事件。你也可以根据需求选其他的选项
- SSL验证:不启用
设置好以后,保存这个HOOK钩子。
接下来,可以进入测试环节。
点击页面上的测试按钮,如果返回错误,说明配置不正确。
返回200,说明配置是正确的。
但是返回200,实际上不一定就能推送成功,要看hook脚本编写的是否正确。
测试
进入仓库,手动创建一个新文件,提交更改
查看宝塔中,webHook的运行日志
进入服务器上的ros目录,查看更新。
可以看到,ros目录下,已经从原来的空目录,变成了拥有三个文件/文件夹的目录。
总结
整个执行过程,是这样的:
1、先在本地开发。然后将代码,提交到gitlab仓库。
2、仓库的钩子,会自动访问宝塔中的脚本。
3、脚本里,会自动将git仓库的代码,拉取到本地的指定目录,实现文件同步
这样,就实现了:开发和维护一套代码,就可以将代码从git仓库,自动同步到不同的项目服务器里。
需要注意的是,只有公开项目,可以这样同步。
私有项目,还需要配置公钥。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 使用宝塔面板的WebHook同步gitLab远程仓库里的git代码