GITEE(码云)在Linux下使用PHP版WebHooks实现自动部署问题总结

2019年04月12日 366 次阅读 0 条评论 0 人点赞

在实现Gitee配合PHP和WebHooks实现自动部署的过程中,很不幸我们踩到了一个又一个的坑,所以特地发送这篇博客做一个汇总总结。在这篇总结中将会非常详尽的一步一步的描述搭建步骤,前半部分都是很基础的部分,各位大神可以略过。

前言
在实现Gitee配合PHP和WebHooks实现自动部署的过程中,很不幸我们踩到了一个又一个的坑,最初拉取dev仓库一直失败,然后切回master仓库还是没效果,最后百度和谷歌都用上,才找到解决办法,看来还是用户组的问题,所以特地发送这篇文章做一个汇总总结。在这篇总结中将会非常详尽的一步一步的描述搭建步骤,前半部分都是很基础的部分,各位大神可以略过。

环境
VPS: 阿里云ECS
OS: CentOS 7.x
Panel(面板): 宝塔

PHP: 7.2

为啥要说明面板?

因为在*UNX系统中,我们很容易忽略用户权限问题,而这些面板在安装过程中往往要创建很多的用户,如在宝塔面板中的www等,不同的面板创建的用户是不同的。所以在后面我还会特别说明如何查看自己的用户。
搭建开始
检查服务器GIT版本
经过测试1.7.0在克隆的时候有bug,如果是1.7.0,请升级至2.0+
# 版本测试
git --version
升级教程,在完成升级后一定要记住git的文件路径,按照如上的教程git的最终路径为/usr/local/git/bin,这个在后面有奇效。
打开PHP禁用函数

在这个自动部署程序中主要用到的函数为shell_exec(),但是在默认情况下是被禁止的,需要去php.ini中修改配置,具体做法如下:

执行命令查找php.ini文件位置

php --ini
找到php.ini文件
查询disable_function 删除shell_exec,
保存
重启PHP
初始化GIT仓库(如果你的服务器已经存在仓库请忽略这一步)
# 进入需要自动部署的目录xxx
cd xxx
# 初始化
git init
# 添加远程仓库
git remote add origin GIT仓库地址

新建PHP文件

创建一个php文件并给与权限进行一次函数测试

// 测试ls是否能用
echo shell_exec("ls -a");
// 检测git是否能用
echo shell_exec("/usr/local/git/bin/git --version");
// 检测执行php文件的用户 -> 在宝塔中是www用户
echo shell_exec("whoami");
给创建的文件权限


sudo chmod -R 777 pulltest.php
测试PHP文件是否可以执行shell_exec()函数。需要特别注意的是在使用git命令的时候一定要使用git的全路径,一开始我们就卡在这里很久,错以为php在执行过程中会读取$PATH环境变量,全路径在检查服务器GIT版本中有提过。

如果一切正常则将其中的内容修改为[1]

$savePath = "网站根目录";
$gitPath  = "代码仓库";//一定要使用ssh方式不然每次都得输入密码
$email = "用户仓库邮箱";
$name  = "仓库用户名";
$git = "GIT全局路径";
$password = "在GITEE设置的密码";
$branch = "你需要pull的分支";
$logName = "LOG名称";

file_put_contents("$logName.log", PHP_EOL.date('Y-m-d H:i:s', time()).": ".PHP_EOL, FILE_APPEND);
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
    file_put_contents("$logName.log", "FAILED".PHP_EOL, FILE_APPEND);
    die('send fail');
}
file_put_contents("$logName.log", $requestBody, FILE_APPEND);
$content = json_decode($requestBody, true);
if($content['password'] == $password){
    if ($content['ref']=="refs/heads/$branch") {
        $result = shell_exec("cd $savePath && $git clean -f && $git pull origin $branch 2>&1");
        $res_log = "[ PULL START ]".PHP_EOL;
        $res_log .= $result;
        $res_log .= PHP_EOL . PHP_EOL;
        file_put_contents("$logName.log", $res_log, FILE_APPEND);
        echo $result;
    }
} else {
    file_put_contents("$logName.log", 'Password is Incorrect!', FILE_APPEND);
    echo 'Password is Incorrect!';
}


最后的最后要给需要执行git pull origin master的目录的地方,把权限设置为与PHP执行时一样的用户组

# 这里以www用户为例,宝塔环境下的用户组默认是www
# 假设/www/wwwroot/blog为网站根目录
sudo chown -R www:www /www/wwwroot/blog
创建公钥(有坑)
根据上一步"检测执行php文件的用户"我们需要给用户生成公钥并添加到gitee中,但是很不幸的是在宝塔中没有/home/www/目录,更别提使用ssh-keygen -t rsa -C "youqq@qq.com"创建公钥了。

所以我们考虑没啥建啥呗,于是我们用root用户新建www目录,/home/www ,然后使用ssh-keygen -t rsa -C "youqq@qq.com"创建公钥,虽然成功了但是要注意的是这还是root用户的公钥,在调用这个WebHooks的时候一直报错Host Key Verification Failed,这招失败我们决定切换到www用户去创建公钥。

但是在执行su - www切换用户的时候系统又他娘的提示错误:This account is currently not available,这个还是蛮好解决的[2]:

# 如果你的用户是apache那把www更换为apache即可
cat /etc/passwd | grep www
# 如果是"/sbin/nologin"
vim /etc/passwd # 找到www改为"/bin/bash"
如果su - www 切换用户时变成-bash4.1-$怎么办?


让我们执行

cp -a /etc/skel/. /home/www
su - www
这样一来执行su - www切换用户就成功了,于是我们可以安安稳稳的执行ssh-keygen -t rsa -C "youqq@qq.com",一路回车下来,但是在最后又撂挑子了,返回信息:Saving the key failed...,继续找问题又弄了将近30min,突然醒悟这个/home/www文件夹是用root用户间的,www用户无权修改,于是回root用户改权限[3]:
# “/home/www”改为www用户
sudo chown -R www:www /home/www
# 回www
su - www
# 生成公钥
ssh-keygen -t rsa -C "youqq@qq.com"
# 输出公钥
cat ~/.ssh/id_rsa.pub
最后把公钥添加进gitee中,似乎一切就要结束了。等等,还有最后一个错误:Host Key Verification Failed,这个错误很明显了就是验证问题,可是公钥已经创建并且添加,又折腾了近半个小时候,恍然大明白,没有把gitee.com添加进known_hosts[4]:
# 需要在www用户下执行
ssh-keyscan -t rsa gitee.com >> ~/.ssh/known_hosts

这次是真的就成功了!

成功截图



人生就像一张白纸,随着时间的流逝,白纸变成了故事

文章评论(0

接收回复邮件通知
非注册会员初次评论需要审核,审核时间(09:00-18:00),请耐心等待...