代码上传gitee自动同步服务器
最近因工作需要,做了一个本地代码上传gitee自动同步到服务器的功能,已成功,现将经过汇总如下。
使用工具:gitee、服务器、gitbash
原理:使用gitee提供的webhook功能,每次push的时候触发webhook,webhook去访问定义好的url所指向的php脚本,php脚本中执行pull,从而完成自动同步到服务器的功能。
具体实现: 假定gitee仓库地址为https://gitee.com/username/websocket_test.git,服务器项目地址为/www/wwwroot/test。 1.保证服务器安装了git,并配置好了user.name和user.email 2.git clone https://gitee.com/username/websocket_test.git,将gitee上的项目克隆到服务器上,这可以保证服务器上的.git和gitee上的.git保持一致。 3.修改.git/congit文件,将url修改为url = https://用户名:密码@gitee.com/username/websocket_test.git。这是为了在执行pull操作的时候,gitee自动获取到用户名和密码,而不需要人工手动输入,方便后边脚本执行。 4.在服务器上添加一个webhook.php文件,这个文件要求外网可以访问到,以便于下一步添加webhook,内容如下:
namespace Home\Controller;
use Think\Controller;
class WebhookController extends Controller{
public function index(){
echo 666;
}
public function webhook(){
$local = '/www/wwwroot/test';
$remote = 'https://gitee.com/username/websocket_test.git';
$password = '123456';
$request = file_get_contents('php://input');
if (empty($request)) {
die('request is empty');
}
$data = json_decode($request, true);
if ($data['password'] != $password) {
die('password is error');
}
echo shell_exec("cd {$local} && git pull {$remote} master 2>&1");
die('done ' . date('Y-m-d H:i:s', time()));
}
}
分析该文件可以很容易得知,这个文件作用就是在被访问的时候,通过shell_exec方法打开项目地址,然后执行pull操作,真正起作用的一句话就是
echo shell_exec("cd {$local} && git pull {$remote} master 2>&1");
5.gitee添加webhook,在“仓库-管理-webhook”这个位置进行添加,主要选择触发条件push,填写触发webhook后访问的url,还有密码,以上图代码举例,密码就是123456。 6.可以尝试本地push了,这个时候一般会发现,webhook被触发,但自动同步并没有成功,这里要特别注意几个点,第一、去掉php禁用函数里边的shell_exec,不然上述代码肯定不生效;第二、webhook访问这个文件是通过www用户,因此有了第7点。 7.进入服务器/home/www,也就是www用户家目录,vim .git-credentials,内容写
https:
运行
git config --global credential.helper store
vim .gitconfig ,内容写
[credential]
helper = store
这一步是为了webhook在通过www用户访问脚本的时候也能自动获得用户名和密码,同时,项目目录/www/wwwroot/test的所有者给www,权限给个755,这样是为了避免出现没有权限被拒绝的错误。 8.现在再本地执行git push的时候,就可以顺利的同步到服务器啦
|