PHP编写webhook无法执行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的更多操作请自行查阅相关资料。
如有疑问可以发送电子邮件给我weiyongqiang@weiyongqiang.com
相关推荐:
以上就是PHP编写webhook无法执行git的详细内容,更多请关注其它相关文章!
上一篇: VIM简单配置实例详解
下一篇: 在PHP中养成7个面向对象的好习惯
推荐阅读
-
crontab无法执行php的解决方法
-
php与Git下基于webhook的自动化部署
-
php-require_once请求的文件不存在的话,之后的代码都无法执行吗?
-
php-mysql 问题笔记一——在命令行中可以执行的sql语句,无法从php页面页面执行!,php-mysqlsql_PHP教程
-
编撰php分页代码 mysql_fetch_arry()就是无法执行
-
gitlab-php-webhook - gitlab webhook php exec 调用 shell 脚本。shell 脚本中调用 git pull 命令无法执行。
-
php中对用户信息进行更新执行mysql语句时update无法正确更新
-
exec - php系统函数可以调用简单命令,无法执行octave脚本?
-
PHP 下载时网页无法执行其他动作
-
centos7 - centos php cli 模式执行命令生成的文件是root用户权限 会造成网页无法读取此文件