Gitee 使用Webhooks 实现项目自动部署

前几天给一个项目做了负载均衡,之后遇到一个问题,如何使多台服务器的代码保持同步呢?

之前的的时候是使用ftp直接上传文件,但是操作起来非常琐碎麻烦,而且面对多台服务器的时候,需要重复操作多次,并且不是及时同步,有一定的时间差在里面。

再或者是在服务器上面安装git,然后登陆各个服务器分别进行pull,也是挺麻烦的。

然后就想到了git的钩子,找到了webhook,能够很好的解决刚刚的代码同步需求(有新的本地 git push 到远程仓库时,服务器仓库自动 git pull 新的代码)。

一、WebHook 简介

  1. 本地执行 git push 命令,push代码到gitee的服务器上。
  2. gitee接收到push请求后,调用我们自己的服务器上的一个接口。
  3. 这个接口下的代码来执行 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地址

共有 1 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据