PHP编写webhook无法执行git的原因:linux中sudo免输入密码运行命令

版权声明:本文为博主魏永强(http://blog.csdn.net/marswill)原创文章,未经博主允许不得转载。 https://blog.csdn.net/hayixia606/article/details/79578239

使用场景:在运维管理中搭建一个可视化的版本控制和代码提交上线部署的平台是非常必要的。在这种情况下运维人员在linux的terminal中使用命令行或者git工具来不是很方便。我们需要的方式是使用webhook自动部署或者一个网页界面化的操作面板来控制。本文和之前的文章《CentOS上搭建git服务以及界面化管理_centos下gogs+nginx+mysql实现私有git服务》是承接关系。如果你是一名运维人员或者开发人员这些都有必要了解。

php执行git操作的webhook

注意这个只是一个简单demo不可作为生产环节使用

//读取webhookpost提交的数据
$data = input('post.');
$wdata = [
    'ref' => $data['ref'],
    'before' => $data['before'],
    'after' => $data['after'],
    'compare_url' => $data['before']
];
//取出需要写入日志的数据
if (isset($data['commits'][0])) {
    $wdata['commits_id'] = $data['commits'][0]['id'];
    $wdata['commits_message'] = $data['commits'][0]['message'];
    $wdata['commits_url'] = $data['commits'][0]['url'];
    $wdata['commits_author_name'] = $data['commits'][0]['author']['name'];
    $wdata['commits_author_email'] = $data['commits'][0]['author']['email'];
    $wdata['commits_author_username'] = $data['commits'][0]['author']['username'];
    $wdata['commits_committer_name'] = $data['commits'][0]['committer']['name'];
    $wdata['commits_committer_email'] = $data['commits'][0]['committer']['email'];
    $wdata['commits_committer_username'] = $data['commits'][0]['committer']['username'];
}
//如果日志目录不存在则创建这个是为了后期分析日志还是很有必要的
//创建目录
if (!is_dir("../logs/".$data['repository']['name'])) {
    shell_exec("mkdir ../logs/{$data['repository']['name']}");
}
//创建文件
if (!file_exists("../logs/{$data['repository']['name']}/".date("Y-m-d").".txt")) {
    shell_exec("touch ../logs/{$data['repository']['name']}/".date("Y-m-d").".txt");
}
//写日志文件
file_put_contents("../logs/{$data['repository']['name']}/".date("Y-m-d").".txt", implode("|||", $wdata), 2);

//看我们的wwwroot目录有没有该项目我的wwwroot目录就是web应用的目录
$path = "/data/wwwroot/".$data['repository']['name'];
if (!is_dir($path)) {
    $commandStr = "cd /data/wwwroot/ && sudo /usr/bin/git clone http://[你自己的git账号]:[你自己的git密码]@git.sikukeji.com/".$data['repository']['full_name'];
    $outPut = shell_exec($commandStr);
    return Json::create($outPut);
}else{
    $commandStr = "cd /data/wwwroot/{$data['repository']['name']} && sudo /usr/bin/git pull";
    $outPut = shell_exec($commandStr);
    return Json::create($outPut);
}

重点代码解释

$commandStr = "cd /data/wwwroot/ && sudo /usr/bin/git clone http://[你自己的git账号]:[你自己的git密码]@git.sikukeji.com/".$data['repository']['full_name'];

以上这句命令首先是切换工作目录到/data/wwwroot 目录下,这个就是我的web目录。第二个命令sudo /usr/bin/git clone http://[你自己的git账号]:[你自己的git密码]@git.sikukeji.com/”.$data[‘repository’][‘full_name’];其实是执行了常规的git命令只。把代码从我们的在线git代码库克隆到本地。

问题分析

这样写完,代码都没有问题其实你的webhook是没有执行的,为什么呢?我们执行git时前面加了sudo。sudo是使用系统管理员身份执行命令,我们知道在linux中使用sudo执行时是需要输入root[管理员]密码的。但是我们使用PHP的shell_exec执行时并没有办法输入密码。这时候怎么办呢?其实linux中有办法让某些命令的执行使用sudo而免输入密码

Linux免输入密码使用sudo

我们需要配置文件/etc/sudoers这个文件从名字我们就可以猜到他的意义。
这里写图片描述

加入git命令免密

这里写图片描述
因为我们的PHP执行其实是使用的www用户。这个我们是可以自行设置的。默认都是www用户。那么PHP中执行git也是使用www用户。让www用户免密码执行git的语句是图中

www     ALL=NOPASSWD:/usr/bin/git

这句话就是授权www用户在所有计算机上以管理员身份运行git而不需要输入密码。关于/etc/sudoers的更多操作请自行查阅相关资料。

如有疑问可以发送电子邮件给我[email protected]

猜你喜欢

转载自blog.csdn.net/hayixia606/article/details/79578239