11-13 13:38 gitlab php nginx 技巧 gitlab webhook 钩子配置 #### 添加www用户ssh 因为项目配置的nginx和php的用户为www,所以代码执行时以www用户,所以需要www用户的ssh密钥。 运行`su www` 切换用户 如遇`This account is currently not available.`提示请先修改`/etc/passwd`文件`www`用户可登录。具体如下: ```shell ;www:x:xx:xx::/home/www:/sbin/nologin www:x:xx:xx:www:/var/www:/bin/bash ``` **(安全起见 钩子配置完成后需修改回为nologin)** 运行`ssh-keygen`为`www`用户生成ssh密钥(如已存在可跳过此步骤). 将生成的`id_rsa.pub`文件中内容复制到gitlab后台`SSH KEYS` 中。 #### 编写sh脚本 ```shell #!/bin/bash cd /www/xxx.com /usr/bin/git pull origin master //或者 强制pull git fetch --all git reset --hard origin/master ``` 将以上内容放置`/home/www/xxx.com.sh`中,再运行`chmod 755 /home/www/xxx.com.sh`修改权限,然后使用www用户执行此脚本,测试是否能够获取代码。 #### 编写php执行脚本 php通过exec函数执行脚本代码hook.php。需要调用exec函数,如果发现不成功,有可能php.ini配置中禁用了exec函数,重新开启即可。 ```php //作为接口传输的时候认证的密钥 $valid_token = '8cfb544bf7c093aac741791079c35f0e'; //调用接口被允许的ip地址 $client_token = $_GET['token']; $client_ip = $_SERVER['REMOTE_ADDR']; $fs = fopen('./auto_hooks.log', 'a'); fwrite($fs, 'Request on ['.date("Y-m-d H:i:s").'] from ['.$client_ip.']'.PHP_EOL); if ($client_token !== $valid_token) { echo "error 10001"; fwrite($fs, "Invalid token [{$client_token}]".PHP_EOL); exit(0); } $json = file_get_contents('php://input'); $data = json_decode($json, true); fwrite($fs, 'Data: '.print_r($data, true).PHP_EOL); //这里也可以执行自定义的脚本文件update.sh,脚本内容可以自己定义。 $res = exec('/home/www/xxx.com.sh', $result); fwrite($fs, 'Data: '.print_r($result, true).PHP_EOL); fwrite($fs, '======================================================================='.PHP_EOL); $fs and fclose($fs); var_dump($result); ``` 将以上内容放在项目可运行访问路径中如`xxx.com/public/hook.php`中。新建`auto_hooks.log`文件存放更新日志。并运行`chmod 755 auto_hooks.log`,修改文件权限。 最后通过浏览器访问测试 xxx.com/public/hook.php?token=8cfb544bf7c093aac741791079c35f0e 如果访问后,能够返回git信息,就是代表成功。如果失败,可以查看auto_hook.log日志。 #### gitlab钩子设置 进入gitlab该项目管理页面,将此地址放入下图中URL并点击`Add Webhook`按钮即可 ![](http://varwill-blog.oss-cn-beijing.aliyuncs.com/markdown/images/98d29b711a1075710fa630b3a5239fcb5fae266b41223.png)