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的公钥配置中
完成这一步之后,我们在服务器上拉取我们的仓库代码
三、拉取仓库代码
我们在站点目录下(假设是/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后台
这样我们就完成钩子配置。
六、补刀操作
有的伙伴之前可能是在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地址中,截图如下
把我们的gitee账户密码追加进去,这样就解决了。
这样就大功告成,我就不用每次提交代码后还要去服务器手动执行拉取。
(PS:还是docker打成镜像方便,哈哈,大家可以参考我之前的文章了解)
0条评论