# 前言

最近在写静态博客,每次在本地写完,push到GitHub上,然后还得去云主机上pull下来,比较繁琐。

# 思考

心里揣测,有没有一种机制,当我push到仓库后,云主机自动去pull下来。(当然,定时一分钟去pull一次当然也能实现,不过那样也太不优雅了)

# 发现

发现了一个叫 Webhooks 的功能。

Webhooks 是代码托管平台提供的一个功能,对于任意一个项目,可以设置一个URL,同时选择一些事件,当触发了这些事件时,代码托管平台会自动请求该URL,并带上一些必要的参数。

简单点说,Webhooks 就是一个项目的钩子函数,当你执行一些事件时,会自动调用这个钩子函数,事件就是 push、pull request、frok 等等这些操作。

代码托管平台有很多,常见的第三方的 GitHub、码云、Coding,或者自己搭建的 GitLab、Gogs等都提供了 Webhooks 功能。

# 实操

在GitHub上添加并设置Webhooks

webhooks

然后在云服务器上开一个web服务器,用来处理GitHub发过来的请求,我这边就是简单的,收到消息后进到工作目录,执行 git pull 。

部分代码如下:

    def POST(self):
        try:
            webData = web.data()
            #print("111 Handle Post webdata is:\n", webData)
            #打印消息体日志
            #print(parse.unquote(str(webData, 'utf-8')))
        
            cmd = 'cd /home/centli/hugoblog/content/post && git pull && rsync -a images ../../static/ && rsync -a files ../../static/'
            with os.popen(cmd) as p:
                r = p.read()
            print(r)

# 结果

从此,当我在本地写完一篇博客推送到GitHub后,再也不用手动登录到云主机执行拉取了。只管推送就行了,然后静静的等待博客页面自动刷新。

webhooks