让git push之后服务器能自动更新代码
自从使用github搭建代码环境之后,就一直面临一个问题,这个问题让我觉得自己是个蠢逼。
之前的代码管理方式是在PC写了代码push到github,再在服务器上git pull。这种方式简单粗暴,但是恶心之处就是,写代码的时候需要同时开着github desktop和xshell,这边push之后还要切到另一边输入命令"git pull",再等个几秒。实在是太蠢了。
后来发现github有个功能,叫webhook,直译是“网页钩子”。这个直译让我想起了多年前的“暗影袜子(shadowsocks)”…网页袜子的功能是,在git push(或者是其他git动作)之后,github会向指定的url以post的方式提交一个请求,请求内容中包含本次动作的相关信息。
webhook的设置在这里可以找到
于是便有了一个想法,就是使用网页袜子访问一个接口,接口的功能是执行shell命令"cd /var/www/html && git pull"。
这个接口长这个样子
phpexec.php
我试着将接口填进github 的webhook里去,执行一次push操作,于是在log文件里看到了提交上来的内容。
乱七八糟的内容无所谓,今天只是想看上传成功没成功。如果日后有需要分析具体内容的时候再把数据拿出来仔细看。
但是,我查看文件有没有更新时,发现虽然push成功了,但是phpexec.php里的git pull并没有执行。
猜测是权限问题。于是各种chmod 777,还试着将apache、www等相关用户加入linux免密列表里,都没有成功。
这个问题进展到这里就被搁置了,我又在push-pull中间蠢逼了半年。今天终于又下定决心,又研究起了这个问题。
这次我想了一个新的方法。既然php执行shell这个路子走不通,就绕过去吧。新的实施方案是,直接写一个shell脚本,每隔5秒执行一次git pull,然后让这个shell脚本在后台执行。
大概搜了一下,貌似是可行的。
然后写两个shell脚本
第一个是延迟+循环的脚本
第二个是git pull的脚本。
这两个脚本完全可以合在一起写的,因为pull的脚本是我早就写好一直在用的,就没有重新把这一行shell命令写到另一个里(懒)。
尝试着运行这个脚本,貌似是正常运行了。
现在就面临一个困境…
我tm也不能一直开着xshell啊…这跟push-pull的蠢逼模式有啥区别…
我想让shell脚本在后台运行,就算关闭了终端,程序也在后台运行着。于是我搜到了这样的命令:
nohup ~/for.sh &
nohup和&可以让shell命令脱离终端执行。
按照提示,这条命令会在忽略所有输入的状态下执行,并将输出放在nohup.out这个文件中。
它输入输出无所谓,只要让我的每5秒一次pull的脚本在后台执行就行。
这时候我push一个文件上去,再在网页上访问,看到文件确实更新了。成功。
让服务器自动执行git pull的总结:
写一个循环pull的shell脚本。
使用nohup命令,让这个循环脚本在后台执行。
接下来是万众期待的Q&A
网页袜子是啥
这可能是只符合我的特色的幽默方式,看不懂的话就理解为webhook吧。
为啥这么墨迹
要是什么事都直截了当,那这世界多无聊啊。
为啥Q&A只有1
我也不知道wx这编辑器怎么编的号。
这次源码太少了,甚至在截图里就包含了三四倍的源码量。所以这次你点击阅读原文,也只能跳转到我的github首页。