Gitee 使用Webhooks 实现项目自动部署
4 票
前几天给一个项目做了负载均衡,之后遇到一个问题,如何使多台服务器的代码保持同步呢?
之前的的时候是使用ftp直接上传文件,但是操作起来非常琐碎麻烦,而且面对多台服务器的时候,需要重复操作多次,并且不是及时同步,有一定的时间差在里面。
再或者是在服务器上面安装git,然后登陆各个服务器分别进行pull,也是挺麻烦的。
然后就想到了git的钩子,找到了webhook,能够很好的解决刚刚的代码同步需求(有新的本地 git push
到远程仓库时,服务器仓库自动 git pull
新的代码)。
一、WebHook 简介
- 本地执行 git push 命令,push代码到gitee的服务器上。
- gitee接收到push请求后,调用我们自己的服务器上的一个接口。
- 这个接口下的代码来执行 git pull 和重启服务等命令(如果需要的话) 完成代码的部署。
二、准备工作
- 这里以 PHP 脚本实现,所以服务器需要 lnmp 环境
- 服务器安装 Git,克隆远程仓库,并配置好 SSH KEY(这个在gitee后台找到WebHook,即可配置)
三、PHP代码
<?php
/*
* @Descripttion: 这是WebHooks的POST地址,服务器用来同步代码变更
* @version: 1.0.1
* @Author: 有花不见叶(https://www.vueweb.cn)
* @Date: 2020-06-27 15:34:57
* @LastEditors: 有花不见叶(https://www.vueweb.cn)
* @LastEditTime: 2020-07-04 10:12:55
*/
//本地路径(服务器上的git项目地址)
$local = '/www/git_project/XXX';
//仓库地址
$remote = 'git@gitee.com:XXX/XXX.git';
//密码(码云添加webhook时设置的密码)
$password = 'XXXXXX';
//获取请求参数
$request = file_get_contents('php://input');
if (empty($request)) {
die('request is empty');
}
//验证密码是否正确
$data = json_decode($request, true);
// var_dump($data);
// die;
if ($data['password'] != $password) {
die('password is error');
}
echo shell_exec("cd {$local} && git pull {$remote} 2>&1");
die('done ' . date('Y-m-d H:i:s', time()));
三、注意事项
- 权限问题(这个问题我搞了好久。。。)
我在配置成之后,在服务器执行git pull是OK的,但是接口访问就是不行,报错信息:密钥配置不对且没有权限。
这是因为,在服务器执行git pull是用的root权限,但是php文件执行shell,使用的www权限。
此时,需要将从root用户切换到www用户,然后重新设置生成密钥。
- 地址问题
仓库地址不要使用https地址,尽量还是使用ssh地址
技术文章,学习了。