宝塔webhook与Gitee配置实现服务器的代码同步更新

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


其中用到一个gitee仓库,和两个宝塔管理后台。

要实现的是,本地向gitee私有仓库推送代码后,两个宝塔服务器的代码同步更新。

实现的过程中,踩了几个坑:

SSL证书报错

hook请求返回成功,但是宝塔上的目标文件夹,并没有同步到任何文件

1.新建私有仓库

可以新建或者导入其他仓库。

由于飞云已经有一个gitLab仓库了,我就直接从其他仓库导入了。



如果导入私有项目,需要提供gitLab的账号和密码。

仓库名字,路径,更加需要来设置。

权限设置为私有。

其他的选项,根据自己的需求设置。

如果是导入项目,创建完成后要等待几分钟,clone远程仓库的内容。

clone完毕后,就可以看到仓库里的文件,已经同步到这个新仓库了。


接下来,我们要实现的功能,就是更新这个仓库的代码,同步推送到多个宝塔服务器里。

2.创建公钥

私有项目同步前,必须配置公钥,才能进行Hook推送。公开项目,则无需配置

在宝塔服务器的终端里,查看密匙

cd ~/.ssh

ls

生成公钥,后面引号的内容,可以自定义。仅用作标识

建议加上服务器的标识,用于区分是哪个服务器或者哪个项目的

ssh-keygen -t ed25519 -C "Gitee SSH Key"

生成的过程中,要确认输入y,按3次回车

然后就会生成一个SHA256的KEY。

列出全部的KEY:

ls ~/.ssh/

查看刚生成的KEY:

cat ~/.ssh/id_ed25519.pub

日志:

The key fingerprint is:

SHA256:VWYCw1eEX5tU9PGn9yaomyE8UkoHWmaARbTTiywUE Gitee SSH Key

The key's randomart image is:

+--[ED25519 256]--+

|+E++o.+.o..+* +o|

|o=o..= ...o= o +|

|.+o.. o ... o o+|

|.. . . . o..|

| . S . .|

| . = . ..|

| o + . . . o|

| . o + o |

| +. |

+----[SHA256]-----+

[root@VM-0-4-centos ~]# ls ~/.ssh/

authorized_keys id_ed25519 id_ed25519.pub id_rsa id_rsa.pub known_hosts

[root@VM-0-4-centos ~]# cat ~/.ssh/id_ed25519.pub

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBuQ6xE+1Ckd6TOS7Cyr7DKCGGZ243RLJL Gitee SSH KeyCOPY

最后的一行内容,就是公钥。

详见:生成、添加 SSH 公钥

添加后,在终端中输入:

ssh -T git@gitee.com

添加成功后,就可以使用SSH协议对仓库进行操作了。

3.添加公钥

将终端生成的公钥,添加到gitee的项目里。

同步私有项目,必须在这里设置宝塔服务器的公钥,用于身份验证。

否则,宝塔服务器是没有权限,拉取私有仓库的代码的。

同步公有项目,则不需要设置公钥。



4.添加宝塔WebHook脚本

在宝塔的应用商店下载并安装宝塔WebHook 2.3

添加一个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/wanbo"

#git 网址

gitHttp="git@gitee.com:wanbo/wanbotest.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

---------------------------------------------------------------------------------------------------------------


添加完成后,查看密匙

其中的http地址,就是hook钩子的请求网址。




添加git仓库同步钩子

Url地址,填写宝塔webhook脚本的http地址

webhook密码,填写宝塔webhook脚本的密匙



由于有两个宝塔服务器,我这里创建了两个HOOK钩子。

这两个钩子,分别指向两个宝塔服务器。

当前仓库的代码有推送之后,HOOK钩子会自动向这两个宝塔服务器的指定目录,推送仓库的全部代码。

注意,推送后,会覆盖宝塔服务器指定目录下的内容!

钩子创建完成后,点击测试,如果返回code:1,说明钩子设置正确。



先去查看宝塔的HOOK脚本运行日志。




再去宝塔的指定目录,查看文件是否同步成功。

遇到的问题

SSL报错

gitlab Hook execution failed: SSL_connect returned=1 errno=0

这个问题比较难搞。百度也搜不到有效的答案。

而我这里两台宝塔服务器,一个可以成功推送,一个就报这个错误。

当时无解。

后来偶然间得到一个提示,说是SSL证书配置错误。

于是看了一下宝塔服务器的SSL证书。

发现面板设置里,开启了SSL访问,但是实际上并没有配置证书。

尝试将面板SSL关闭,修改git中HOOK地址的https,改为http

再测试推送,竟然不再报错!

说明问题就出在,宝塔面板没有配置SSL证书。


5.同步内容为空

HOOK钩子执行了,但是宝塔的文件目录里,并没有同步到文件。

百度还是无解。自己解决。

逐行检查HOOK脚本,发现远程git仓库的地址,可能配置错了。

将仓库的http地址,改为ssh地址,问题得到解决。

原来,私有项目的hook脚本,仓库地址一定要使用ssh地址。


此外,为了得到更多的HOOK信息,我还对HOOK脚本做了进一步的优化。

首次克隆git配置文件之后,通过判断文件夹是否存在,来判断同步是成功还是失败:

                # 检查是否克隆成功

                if [ ! -d ".git" ]; then

                    echo "克隆git配置失败!请检查远程仓库地址是否正确!"

                    echo "-------------End-------------"

                    exit

                fi

另外,仓库内容拉取完毕之后,再判断是否pull成功:

        # 判断是否pull成功

        if [ $? == 0 ];then

            echo "pull success"

        else

            echo "pull fail"

        fi

解决这些问题之后,就可以愉快的进行开发了


7. 身份验证

如果遇到无法同步代码的情况,还有一个操作。

在宝塔终端里,配置git身份

git config --global user.name "gitee用户名"

git config --global user.email "gitee注册邮箱"

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容