如何在docker官方php镜像使用WebHook设置git自动部署

发布于 2020-03-28 21:00:39

如何在docker官方php镜像使用WebHook设置git自动部署

目录&流程
[toc]

什么是WebHook

WebHook git事件产生的时候(比如 git push)以标准的 HTTP 协议把事件内容通知到指定服务器, 从而服务器做例如通知、自动部署、代码检查等的集成整合。

docker设置WebHook难点

如果普通的lnmp环境设置WebHook,因为只要增加一个http能访问的地址,然后通过shll_exec() 运行git pull即可。
但换成docker就不一样了,因为官方的php镜像很'干净',没装git ,更没装生成ssh公钥的相关工具,同时也会遇到不少权限问题,这就带给docker设置WebHook增加了不少难点。

需要注意的是,docker里的git公钥无法使用寄主机里的,必须重新生成。

解决思路

  1. 安装git
  2. 安装ssh,生成本机ssh公钥(如果是需要公钥进行鉴权的话)
  3. 安装sudo,为了php进程能以root身份运行git pull
  4. 编写对应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 gitapt-get install sshapt-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 更新了~

0 条评论

发布
问题