gitee webhook 配合 宝塔hook实现网站代码的自动更新

本地开发完毕,提交 git ,自动触发 gitee webhook,

gitee webhook对线上服务器发起请求,触发服务器上的宝塔hook,接下来宝塔请求git同步,从而把gitee最新代码通过git同步到网站。

实现了本地开发完毕,提交git,线上就自动更新的过程。

为什么使用 gitee ?主要是速度快,github (或gitlab,gitea等)也有 webhook

为什么使用 宝塔hook?使用 php 简单写两句 git clone 也可以,但是 php服务器状态不一定正常,比如有时候502需要重启,而宝塔进程相对更加稳定。

服务器配置git

一般来说,已经安装了git,查看已安装版本号:

git --version

如果没有安装:

yum install git

配置git密钥

查看是否有密钥

cd ~/.ssh
ls
cat id_rsa.pub

如果没有,生成一个:(按前一个步骤查看)

ssh-keygen -t rsa 

把得到的公钥,放在 gitee 指定仓库 (管理 –> 公钥管理)中(添加一个)

添加 giteehook

在宝塔商城里 webhook ,

安装完毕后,添加一个 hook,名称随意,代码如下:

#!/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/huaz"
#git 网址
gitHttp="git@gitee.com:zhufenghua1998/huaz.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

修改 git 路径,以及 url 两个参数。

重启一下 宝塔面板:(先切换 root )

/etc/init.d/bt restart

配置 git

git config --global user.name "用户名"
git config --global user.email "邮箱"
git config --global credential.helper store //会生成.gitconfig 的文件
cat .gitconfig   //如果报错: No such file or directory,就用下一行的代码
cat ~/.gitconfig  //显示内容

尝试克隆代码,到本地,检测git环境:

git clone https://gitee.com/XXX/XXX.git  //clone后面是下载链接

(假设 git 已经正常。。。)

点击 宝塔 的webhook,刚才添加的一个项目。查看密钥

宝塔WebHook使用方法:
GET/POST:
http://fewfewf.com:8888/hook?access_key=xxxxxxxxxxxxxxx&param=aaa
@param access_key string HOOK密钥
@param param string 自定义参数(在hook脚本中使用$1接收)

除了顶部的直接复制密钥外,也可以复制 url 的 access_key 参数,它们是一模一样的。

在 gitee 的 webhook (项目–> 管理 –> webhook)中,添加一个,均使用默认即可(也就是密码验证)

其中 URL 是前面宝塔的 webhook 给出的 url,最后的aaa参数,换成仓库名。

webhook密码,也就是宝塔hook的密码。

填完这两个参数,理论上已经完全ok,但实际可能有问题。

错误排查

宝塔的 webhook ,是否正常?它需要写一段代码,虽然前面已经复制粘贴了,但是会有错误。

我们点击一下测试宝塔的 webhook,如果提示:

2022-08-23 23:16:30
Start
param参数错误
End

则说明代码正常,如果仅有一个 Star,就说明文件格式出了问题。(你可能是从网页里复制过来的,所以乱码)

随意新建一个 .sh 或其他文件,然后粘贴上面的代码,接下来打开命令终端:

vim test.sh 打开文件,执行:set ff=unix设置文件为unix,然后执行:wq,保存成unix格式。

转换格式后,再打开该文件,复制转换后的代码,粘贴到宝塔的 webhook 中,看看是否正常了,如果输出 xxx 参数错误则说明文件格式 ok。

gitee的webhook是否正常?点击测试,并刷新页面,查看响应日志,

如果响应体如下,则说明正常:

{
  "code": 1
}

同时,也可以查看宝塔 webhook 的调用次数,观察 gitee 的 webhook ,是否能触发 宝塔的 webhook 。

最后,列出一些正确的日志:

2022-08-23 23:17:38
Start
Web站点路径:/www/wwwroot/huaz
Already up-to-date.
End

2022-08-23 23:18:10
Start
Web站点路径:/www/wwwroot/huaz
Updating d20b2cb..1e91e3f
Fast-forward
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
End

如果是测试触发的,会像第一个日志,没有需要同步的文件,如果是更新推送到 gitee 从而导致自动触发更新,则像后面那个,自动同步了文件。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注