缘起
给朋友做的小项目,托管在gitee上,每次修改都要登录到服务器上执行命令:
git pull
后了解到git的钩子机制,进而发现了gitee的webhook,现在说下这玩意怎么用。
原理
- 本地执行 git push 命令,push代码到gitee的服务器上。
- gitee接收到push请求后,调用我们自己的服务器上的一个接口。
- 这个接口下的代码来执行 git pull 和重启服务等命令(如果需要的话) 完成代码的部署。
实操
上面的过程中,我们需要做的就是实现一个接口。这个可以完成拉取代码、重启服务等步骤,如果是php开发的应用,只需要pull代码即可。
实现接口
这个接口可以用自己熟悉的语言开发,比如php,python等脚本语言,简单粗暴。
下面我们来用php写一个demo
demo
新建一个叫做build.php的文件,添加一下内容
<?php
$cmdRes = shell_exec('git pull');
echo $cmdRes;
这个文件中,通过 shell_exec 函数直接执行 git pull 命令,达到同步代码的效果。
ps:这份代码并不完善,需要增加来源验证,日志记录,安全验证等逻辑
排坑
执行用户的权限问题
例如php的项目一般是借助php-fpm来处理请求,这时需要注意php-fpm的配置文件中是配置了一个系统用户来执行逻辑的。需要将这个用户的公钥配置到gitee上,如果这个用户还没有配置公钥,可以通过一下命令来生成。
sudo -u [用户名] ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
这里注意下,如果不清楚php-fpm的用户名,可以通过查看php-fpm进程的方式知道名字
[root@local ~]# ps -ef | grep php
root 13715 1 0 7月23 ? 00:00:04 php-fpm: master process (/etc/php-fpm.conf)
apache 13716 13715 0 7月23 ? 00:00:00 php-fpm: pool www
apache 13717 13715 0 7月23 ? 00:00:00 php-fpm: pool www
apache 13718 13715 0 7月23 ? 00:00:00 php-fpm: pool www
apache 13719 13715 0 7月23 ? 00:00:00 php-fpm: pool www
apache 13720 13715 0 7月23 ? 00:00:00 php-fpm: pool www
apache 15427 13715 0 15:42 ? 00:00:00 php-fpm: pool www
apache 16296 13715 0 16:42 ? 00:00:00 php-fpm: pool www
root 16752 16736 0 18:07 pts/0 00:00:00 grep --color=auto php
我这里的用户名是apache
或者将php代码中要执行的命令修改为
$cmdRes = shell_exec('whoami');
var_dump($cmdRes); exit;
这样调用这个接口也可以知道这个用户名是什么。
最后将公钥配置到gitee上。
文件权限问题
需要将代码的owner全部修改为php-fpm的用户