gitee同步到宝塔服务器

gitee同步到宝塔服务器

       最近由于某个项目分支有点多,而且还是部署在不同的服务器,由于之前代码更新是上服务器上直接手动执行拉取,所以比较繁琐,于是打算利用gitee的WebHook来进行自动拉取,自己捣鼓了一番,在这里跟大家分享一下这个过程。

       一、exec命令解除

       由于公司用的是宝塔面板,默认PHP的exec命令是被禁用的,所以需要把exec解除禁用,这一步可以直接百度,在这里就不详细描述了。

       二、配置公钥

       这一步操作就是避免我们每次执行拉取命令的时候,老是要弹出账号密码验证,我们先切换成www角色,然后生成

su www

这一步可能会提示以下错误

This account is currently not available

我们可以直接修改/etc/passwd文件这一行配置,修改如下

www:x:1000:1000::/home/www:/sbin/nologin
改为
www:x:1000:1000::/home/www:/bin/bash

然后我们执行以下命令来生成公钥,假设我们的邮箱是test@qq.com,执行以下命令生成公钥

 ssh-keygen -t rsa -C "test@qq.com"

这样会在/home/www/.ssh/id_rsa.pub文件中生成我们的公钥,我们可以执行以下命令查看

cat /home/www/.ssh/id_rsa.pub

然后复制内容,添加到gitee的公钥配置中

123.jpg

完成这一步之后,我们在服务器上拉取我们的仓库代码

       三、拉取仓库代码

       我们在站点目录下(假设是/www/wwwroot/test)执行以下命令拉取代码,地址替换成你们自己的仓库地址,记住仓库地址选择SSH,不要选择HTTPS。

git init
git remote add origin git@gitee.com:test/system.git
git pull origin test

这里我们拉取的是test分支,大家根据自己的情况进去拉取,我们要先提前拉取一遍。

       四、创建webHook钩子

       由于我这个是个PHP项目,所以我直接在项目根目录下直接创建一个PHP文件,命名为pushWebHook.php,我们这里用的是签名密钥模式,密钥是system,大家根据自己情况定义,访问路径是https://test.com/pushWebHook.php,钩子内容如下

<?php

//webHook密钥【可替换成自己的】
$webHookSecret = "system";

//以流的方式读取传输过来的json
$body = file_get_contents("php://input");
if (empty($body)) {
    http_response_code(400);
    die('无输入');
}
//json转换为array
$body = json_decode($body, true);

//签名验证
$secretJoin = $_SERVER["HTTP_X_GITEE_TIMESTAMP"] . "\n" . $webHookSecret;
$mySign = base64_encode(hash_hmac('sha256', $secretJoin, $webHookSecret, true));
if ($mySign !== $body['sign']) {
    http_response_code(400);
    die('签名错误');
}

//获取推送分支
$branch = str_replace('refs/heads/', '', $body['ref']);

//初始化数据
$res = null;

//同步测试服
if ($branch == "test") {
    //拉取代码【/www/wwwroot/test可替换成自己的站点地址】
    $command = 'cd /www/wwwroot/test && git pull origin wjtest 2>&1';
    $res = exec($command); 
}

// 返回结果
echo 'git pull执行结果:' . $res;

?>

我这里的站点地址是/www/wwwroot/test,这个地址也是前面拉取仓库的目录,我这里是判断如果是test分支,才拉取,其他分支一概不处理。

       五、部署钩子

       假设我们的访问地址是https://test.com/pushWebHook.php,密钥是system,我们直接配置到gitee后台

1234.jpg

这样我们就完成钩子配置。

      六、补刀操作

      有的伙伴之前可能是在root账号下拉取的仓库,使用webHook拉取代码可能会出现权限问题,我们可以直接使用以下命令来赋予站点权限给www,执行以下命令

chown -R www /www/wwwroot/test

这个操作一定是要在root权限下执行,切换命令可以执行

su root

来完成。

       七、其他问题

       我在两台服务器都配置了钩子,有一台可能之前用root弄的,所以在拉取的时候出现这个错误

fatal: could not read Username for 'https://gitee.com': No such file or directory

  对于这个问题的解决办法,就是进到我们的项目中打开.git目录下的config文件,将username:password@加入到clone地址中,截图如下

12345.png

把我们的gitee账户密码追加进去,这样就解决了。

       这样就大功告成,我就不用每次提交代码后还要去服务器手动执行拉取。

(PS:还是docker打成镜像方便,哈哈,大家可以参考我之前的文章了解)


0条评论

发表评论