GitLab Webhooks PHP

利用 GitLab 简单的自动更新

Posted by HaoDu on November 2, 2018

原理

当 GitLab 项目内容有变动时,会去请求设置好的url,执行预置的脚本,自动更新代码

步骤

1. GitLab 集成中配置好url

1
www.baidu.com/hook.php

SSL verification Enable SSL verification 不知道为啥,即使勾选了 ssl 验证,依然能够完成自动部署

2. 将服务器上ssh 公钥复制,放到 GitLab

(这一步可以跳过)

不知这一步是否起作用,我复制的root 用户的公钥,应该复制调用脚本的用户的公钥, 在此操作之前执行了

1
git config --global credential.helper store

(免去每次git pull输入密码)

3.脚本

建立test.php 文件

1
2
3
4
<?php 
//可通过下面这句查看执行脚本的用户是谁,方便在浏览器中调试
//echo exec('whoami');
exec('sudo cd /data/www/project;sudo git pull')
1
$php test.php //可在服务器直接执行

或者写个脚本去执行shell脚本(试验上面那种方法未成功,GitLab 中显示红色 ==internal error==,可能是因为忘了+ sudo,加上之后就可以了 应该是语法错误,测试不加 sudo,只是没有完成更新,GitLab 仍是绿色200)

1
var_dump(exec("sudo sh /data/www/shell/Bke.sh"));

脚本代码

1
2
3
#!/bin/bash
cd /data/www/Bke && git checkout develop;
git pull;

4.权限配置问题(==即使权限配置有问题,GitLab 上仍然显示200 ,只要访问这个链接没有问题,他就是200==)

1.通过php exec函数 执行的话,要确保exec函数没有被禁用
1
2
$which php //查看php路径
/usr/bin/php

找到php.ini 文件,查看是否禁用exec函数

2通过下面命令查看执行php的用户是哪一位沙雕
1
2
$ps -aux| grep 'php'
$ps -aux| grep 'php-fpm'
3给该用户最高权限

(能用git,能用test.php) 通过上一步我们知道了是apache这位沙雕在执行脚本
然后 服务器执行visudo ,结果里面有这样一段

1
2
3
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

把下边的加上

1
2
apache   ALL=(ALL)       ALL
%apache        ALL=(ALL)       NOPASSWD: ALL