在项目开发中我们经常使用git来更方便管理自己的项目;
有用github、gitee、gitlab的;
有一种场景在项目开发中经常遇到;
一般情况下我们开发会有3个分支
- 测试分支:test
- 开发分支:dev
- 正式分支:master
我们再本地dev开发分支上进行开发,合并到test分支进行测试,测试完毕合并到master分支进行上线;
那么如何做到在master分支push之后正式环境的项目也同时进行pull?
我们选用 ssh 的方式对项目进行clone,防止安全以及来回输入密码的问题;因此使用ssh更方便;
也就是在master分支上进行推送,项目就上线!
- 首先找到linux 上 php-fpm 的运行组,查看master进程
- 查看php-fpm运行用户
cat /www/server/php/74/etc/php-fpm.conf
- 可以看到的是www用户,比较重要
- 切换到www用户下创建密钥对,这里需要重点说明:由于我们等下要使用exec函数来执行shell脚本,是使用www用户组来执行的,而非root用户,很多朋友直接在root下创建密钥对,后面导致各种代码pull不成功(都是由权限的问题导致的),这里再说一次一定要注意切换到www用户下创建密钥对;
#切换用户组
su www
可能会报错:
This account is currently not available.
意思就是说当前用户不可用,一般情况下是我们限制以此种方式登录,此时:
vim /etc/passwd
修改php-fpm 组
#替换
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
复制密钥到码云后台,这里选择个人公钥,码云上有说明具体的原因,可自由选择:
粘贴到公钥处确定即可;
- 返回到服务器上,使用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,如下图:
- 点击测试
- 查看日志
可以看到已经成功;
下面说明一些问题:
- 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
此时应该就有执行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都适用,如果有帮助,请在下方给出精彩回复!