我这边一直在维护一个 web 静态网页,每次修改一点点小东西就需要去服务器 git pull 拉取一下最新的代码,我们用的代码托管是极其强大的 git lab 我听说有自动部署这个功能,于是我就想能不能利用上这个功能在我每一次 git push 代码的时候就让服务器自动去部署一下呢,免得每次改一个小东西还要登陆服务器手动去拉取代码,我看了一下发现由于我的这个就是一个简单的静态网页而且编译都是直接我在这边编译好提交到仓库的那边服务器没有什么复杂的操作就是实现一个 git pull 一下就好了,于是我用那些强大的 gitlab-ci 之类的强大自动部署工具好像有点杀鸡用牛刀的感觉了,于是我发现有个 gitlab webhooks 功能,我们用的问题管理系统 ( PM 面板 )好像就是用的这个东西实现的,我也可以到服务器写一个 hook ( 钩子 ),git lab 这边设置监听到代码更新就通知那边接口去拉取代码…
由于我这个 web 静态项目本来就是使用了 php 的,于是我在钩子这边就使用 php 来写了,当然也可以用 Java, JavaScript,Python,GO等其他语言来实现,php 的话代码其实是很简单的
<?php
echo shell_exec('cd ../ && /usr/bin/git pull > /dev/null && echo "git pull Success"');
原理:就是利用 php 的 shell_exec 函数去执行一个简单的 git pull 操作,由于我这个是在项目的子目录 api 下面首先我是先 cd .. 返回了一下到项目根目录,然后是利用 git 软件的全路径去执行的,因为这里直接用 git 它是不知道这个程序的路径的,只有一些 Linux 的底层指令才可以直接写,其他尽量带上全路径吧,这算个小坑吧,还有就是直接访问这个的话 php 的执行路径是在 api 目录下的,还有 php 的运行用户需要注意一下,如果你在网页去请求触发这个不能执行的话建议检查一下 php.ini 中设置的用户和用户组是否有执行这个程序的权限,还有一个值得注意的是千万不要用 get 或者 post 从参数获取执行的命令一定要文件里写死,否则很容易导致服务器被黑…
好了接下来就是设置这个钩子的触发了
首先我们可以看看 git lab 官方给的文档:https://docs.gitlab.com/ee/user/project/integrations/webhooks.html
首先在 git lab 项目仓库的 Settings 找到 Integrations 打开可以看到自定义的设置面板
这个 hooks 的设置其实是很强大了,为了保证我们 hook 的安全我们还有可以设置一些 token 或者 ssl 等认证方式…(这里我为了简单就没有去弄这些花里胡哨的了,当然以后我也会给完善好的)
输入 URL 后输入 token (没有就不用 token),然后就是选择触发条件,我这里选择的是 push events (当这个仓库有 git push 事件的时候会触发这个条件,当然下面还可以设置一些触发条件的匹配,我这里没有特殊要求也没做处理了),除了 push events 下面还有很多很强大的触发条件,这里我就不一一介绍了,有需要的话建议看文档了解一下,添加好后还可以在线 test 测试一下可用性,当然它去请求这个 web hook 的时候还会带上这次 push 的相关信息,非常有用,我这里只是引入门简单讲了一下,利用这个功能我相信小伙伴们能创造出更大的世界,去探索吧……