Skip to content

让git push之后服务器能自动更新代码

2019-3-1

原文

自从使用github搭建代码环境之后,就一直面临一个问题,这个问题让我觉得自己是个蠢逼。

之前的代码管理方式是在PC写了代码push到github,再在服务器上git pull。这种方式简单粗暴,但是恶心之处就是,写代码的时候需要同时开着github desktop和xshell,这边push之后还要切到另一边输入命令"git pull",再等个几秒。实在是太蠢了。

后来发现github有个功能,叫webhook,直译是“网页钩子”。这个直译让我想起了多年前的“暗影袜子(shadowsocks)”…网页袜子的功能是,在git push(或者是其他git动作)之后,github会向指定的url以post的方式提交一个请求,请求内容中包含本次动作的相关信息。

webhook的设置在这里可以找到

1

2

于是便有了一个想法,就是使用网页袜子访问一个接口,接口的功能是执行shell命令"cd /var/www/html && git pull"。

这个接口长这个样子

phpexec.php

3

我试着将接口填进github 的webhook里去,执行一次push操作,于是在log文件里看到了提交上来的内容。

4

乱七八糟的内容无所谓,今天只是想看上传成功没成功。如果日后有需要分析具体内容的时候再把数据拿出来仔细看。

但是,我查看文件有没有更新时,发现虽然push成功了,但是phpexec.php里的git pull并没有执行。

猜测是权限问题。于是各种chmod 777,还试着将apache、www等相关用户加入linux免密列表里,都没有成功。

这个问题进展到这里就被搁置了,我又在push-pull中间蠢逼了半年。今天终于又下定决心,又研究起了这个问题。

这次我想了一个新的方法。既然php执行shell这个路子走不通,就绕过去吧。新的实施方案是,直接写一个shell脚本,每隔5秒执行一次git pull,然后让这个shell脚本在后台执行。

大概搜了一下,貌似是可行的。

然后写两个shell脚本

第一个是延迟+循环的脚本

5

第二个是git pull的脚本。

6

这两个脚本完全可以合在一起写的,因为pull的脚本是我早就写好一直在用的,就没有重新把这一行shell命令写到另一个里(懒)。

尝试着运行这个脚本,貌似是正常运行了。

7

现在就面临一个困境…

我tm也不能一直开着xshell啊…这跟push-pull的蠢逼模式有啥区别…

我想让shell脚本在后台运行,就算关闭了终端,程序也在后台运行着。于是我搜到了这样的命令:

nohup ~/for.sh &

nohup和&可以让shell命令脱离终端执行。

8

按照提示,这条命令会在忽略所有输入的状态下执行,并将输出放在nohup.out这个文件中。

它输入输出无所谓,只要让我的每5秒一次pull的脚本在后台执行就行。

这时候我push一个文件上去,再在网页上访问,看到文件确实更新了。成功。

让服务器自动执行git pull的总结:

写一个循环pull的shell脚本。

使用nohup命令,让这个循环脚本在后台执行。

接下来是万众期待的Q&A

网页袜子是啥

  这可能是只符合我的特色的幽默方式,看不懂的话就理解为webhook吧。

为啥这么墨迹

    要是什么事都直截了当,那这世界多无聊啊。

为啥Q&A只有1

    我也不知道wx这编辑器怎么编的号。

9

这次源码太少了,甚至在截图里就包含了三四倍的源码量。所以这次你点击阅读原文,也只能跳转到我的github首页。

© thebestxt.cc
辽ICP备16009524号-8
本站所有文章版权所有,转载请注明出处