什么是WebHook
WebHook git事件产生的时候(比如 git push)以标准的 HTTP 协议把事件内容通知到指定服务器,
从而服务器做例如通知、自动部署、代码检查等的集成整合。
docker设置WebHook难点
如果普通的lnmp环境设置WebHook,因为只要增加一个http能访问的地址,然后通过shll_exec() 运行git pull即可。
但换成docker就不一样了,因为官方的php镜像很’干净’,没装git ,更没装生成ssh公钥的相关工具,同时也会遇到不少权限问题,这就带给docker设置WebHook增加了不少难点。
需要注意的是,docker里的git公钥无法使用寄主机里的,必须重新生成。
解决思路
安装git
安装ssh,生成本机ssh公钥(如果是需要公钥进行鉴权的话)
安装sudo,为了php进程能以root身份运行git pull
编写对应php代码
详细流程
安装git、ssh、sudo
1、进入docker环境,命令:docker exec -it xxx /bin/bash
其中xx代表镜像ID,可通过docker ps查看
2、初始化安装环境:apt-get update
3、分别安装git、ssh、sudo:apt-get install git、apt-get install ssh、apt-get install sudo
4、ssh的作用是安装ssh-keygen,然后生成ssh公钥。执行ssh-keygen
命令,这里偷懒,遇到提示可以一直回车,生成公钥后,通过cat ~/.ssh/id_rsa.pub
查看公钥,最后把公钥提交到对应的git管理平台。
编写WebHook对应php代码
$pwd = '/var/www/html/test'; // 项目地址
$command = 'cd ' . $pwd . '&& sudo git pull origin master 2>&1';
$aa = exec($command,$output, $return_var);
// 输出运行结果
var_dump($aa);
var_dump($output);
var_dump($return_var);
这时如果直接允许的话,是会出现错误提示:sudo: no tty present and no askpass program specified,不急,我们下一步解决
设置php的sudo权限
上一步出现错误,是因为当前的php进程所属用户没有没有开启免密码导致的。
首先把php代码改一下
$aa = exec('whoami',$output, $return_var);
// 输出运行结果
var_dump($aa);
var_dump($output);
var_dump($return_var);
通过whoami
确定php进程所属用户名。
现在假设用户名是:www-data
然后 vi /etc/sudoers
,在内容里增加一行:www-data ALL = NOPASSWD: ALL
,保存推出。
再把php代码改为原来:
$pwd = '/var/www/html/test'; // 项目地址
$command = 'cd ' . $pwd . '&& sudo git pull origin master 2>&1';
$aa = exec($command,$output, $return_var);
// 输出运行结果
var_dump($aa);
var_dump($output);
var_dump($return_var);
这时http访问就成功触发git pull 更新了~