如何在docker官方php镜像使用WebHook设置git自动部署
目录&流程
[toc]
WebHook git事件产生的时候(比如 git push)以标准的 HTTP 协议把事件内容通知到指定服务器, 从而服务器做例如通知、自动部署、代码检查等的集成整合。
如果普通的lnmp环境设置WebHook,因为只要增加一个http能访问的地址,然后通过shll_exec()
运行git pull
即可。
但换成docker就不一样了,因为官方的php镜像很'干净',没装git ,更没装生成ssh公钥的相关工具,同时也会遇到不少权限问题,这就带给docker设置WebHook增加了不少难点。
需要注意的是,docker里的git公钥无法使用寄主机里的,必须重新生成。
docker exec -it xxx /bin/bash
其中xx代表镜像ID,可通过docker ps
查看apt-get update
apt-get install git
、apt-get install ssh
、apt-get install sudo
ssh-keygen
命令,这里偷懒,遇到提示可以一直回车,生成公钥后,通过cat ~/.ssh/id_rsa.pub
查看公钥,最后把公钥提交到对应的git管理平台。$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进程所属用户没有没有开启免密码导致的。
首先把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 更新了~