码云,git , php 使用 webhook 实现本地推送master 及时上线

bloger 2021-02-07 PM 47℃ 0条

在项目开发中我们经常使用git来更方便管理自己的项目;

有用github、gitee、gitlab的;

有一种场景在项目开发中经常遇到;

一般情况下我们开发会有3个分支

  • 测试分支:test
  • 开发分支:dev
  • 正式分支:master

我们再本地dev开发分支上进行开发,合并到test分支进行测试,测试完毕合并到master分支进行上线;

那么如何做到在master分支push之后正式环境的项目也同时进行pull?

我们选用 ssh 的方式对项目进行clone,防止安全以及来回输入密码的问题;因此使用ssh更方便;

也就是在master分支上进行推送,项目就上线!

  • 首先找到linux 上 php-fpm 的运行组,查看master进程

Dingtalk_20210207152222.jpg

  • 查看php-fpm运行用户
cat /www/server/php/74/etc/php-fpm.conf

Dingtalk_20210207152324.jpg

  • 可以看到的是www用户,比较重要
  • 切换到www用户下创建密钥对,这里需要重点说明:由于我们等下要使用exec函数来执行shell脚本,是使用www用户组来执行的,而非root用户,很多朋友直接在root下创建密钥对,后面导致各种代码pull不成功(都是由权限的问题导致的),这里再说一次一定要注意切换到www用户下创建密钥对;
#切换用户组
su www

可能会报错:

This account is currently not available.

意思就是说当前用户不可用,一般情况下是我们限制以此种方式登录,此时:

vim /etc/passwd

修改php-fpm 组

Dingtalk_20210207153032.jpg

#替换
www:x:1000:1000::/home/www:/sbin/nologin

#为

www:x:1000:1000::/home/www:/bin/bash

做完之后的一系列操作之后建议改回去;

然后再

su www

此时生成密钥

ssh-keygen -t rsa -C '你的Git Hub邮箱'

复制密钥:

cat ~/.ssh/id_rsa.pub

复制密钥到码云后台,这里选择个人公钥,码云上有说明具体的原因,可自由选择:

Dingtalk_20210207153711.jpg

粘贴到公钥处确定即可;

  • 返回到服务器上,使用www用户组,进行项目初始化,。
su  www
cd /www/wwwroot/ &&  git clone '你的项目ssh 地址'

此时如果你克隆成功就说明没有问题了,如果失败请再留言区贴上错误信息;

  • 编写php hook代码,以下我们就简单写一下,如果要做sign验签的请根据文档做验签;将一下代码直接放到项目跟目录即可;
error_reporting(1);

$path = "/www/wwwroot/cj.093.net.cn/";//更新

//密码
$password = '你的密码';

//获取请求参数
$request = file_get_contents('php://input');


//验证密码是否正确
$data = json_decode($request, true);

if ($data['password'] != $password) {
    header("HTTP/1.1 403 Forbidden");
    die('非法提交');
}


if (isset($data['ref']) && $data['total_commits_count']>0) {

    $res_log = '----------------pull begin------------------------';

    $res_log .= shell_exec("sudo cd {$path} && git  pull git@gitee.com:phpbloger/cj.093.net.cn.git 2>&1"); 

    $res_log .= '------------------------------------------------------------'.PHP_EOL;
    $res_log .= $data['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $data['repository']['name'] . '项目的' . $data['ref'] . '分支push了' . $data['total_commits_count'] . '个commit:'.$data['commits']['message'];

    $res_log .= $res.PHP_EOL;
    $res_log .= "pull end -----------------------------------------------------".PHP_EOL;

    file_put_contents( '/www/wwwlogs/web_hook.log', $res_log , FILE_APPEND );
    die('done ' . date('Y-m-d H:i:s', time()));
}
  • gitee后台建立一个WebHooks,密码随便,地址填写你的项目跟目录的web_hook.php,如下图:

Dingtalk_20210207154532.jpg

  • 点击测试
  • 查看日志

Dingtalk_20210207154832.jpg

可以看到已经成功;

下面说明一些问题:

  • exec、shell_exec 执行不成功?

解决办法:很多服务器上的php环境已经限制了exec,shell_exec一系列的函数;
请在函数禁用列表中将其释放;

  • git pull代码时候报错

error: cannot open .git/FETCH_HEAD: Permission denied

是因为当前登录用户没有修改目录的权限。

解决办法:需要权限;

cd /www/wwwroot/你的项目下

chown  -R  www.www ./.git/

#www.www 是你php-fpm用户组名成,根据自己的替换
  • 在服务器上执行 exec,shell_exec可行,在浏览器上执行不可行;

这个问题很普遍,在服务器上执行是因为用户是root,而浏览器下执行时php-fpm用户组权限不足问题导致;

要解决这个问题,

登录服务器

visudo

找到root ALL=(ALL) ALL

再其中下方添加一行,很多网友说加www ALL=(ALL) ALL ,并非如此而是NOPASSWD:ALL:

www   ALL=(ALL)       NOPASSWD:ALL

Dingtalk_20210207155847.jpg

此时应该就有执行exec、shell_exec等一系列函数的权限了;

  • 执行git pull报错:It is required that your private key files are NOT accessible by others

出现该问题是权限0644对于文件~/.ssh/id_rsa太开放了。

因此降低权限:


chmod 600 ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
  • git pull ,git clone Host key verification failed.

出现该问题一般是,秘钥不正确,请严格参展以上的方法执行,一定要是php-fpm用户组,而非root或者其他用户组;

总结:以上就是关于码云,git , php 使用 webhook 实现本地推送到master及时上线的方法,不管是gitee,还是github、gitlab都适用,如果有帮助,请在下方给出精彩回复!

标签: gitee

非特殊说明,本博所有文章均为博主原创。

上一篇 Element ui 在IE11下的各种不兼容问题
下一篇 没有了

评论啦~