当前位置:   article > 正文

centos7部署gitee的webhook实现自动部署,钩子程序中执行shell报错,但只在在服务器执行shell可以_shell配置gitee webhooks

shell配置gitee webhooks

在自己的服务器上打通git远程仓库以及利用gitee提供的webhook来实现php项目的自动部署,刚开始一切都很顺利,大致步骤如下:

1、新建仓库

这样就可以了

2、确保windows本地是安装了git的,没有就安一个,然后cmd执行

  1. git config --global user.name "小小鬼Leo"
  2. git config --global user.email "540882814@qq.com"

3、进入到进到php的www目录,然后执行以下代码

git clone git@gitee.com:xiaoxiaogui/test.git

4、这时候我们可以在test目录下增加文件,我这里加的111.txt

5、右键选择Git Bash Here,然后执行以下代码

  1. git add .
  2. git commit -m '第一次提交代码'
  3. git push -u origin master

然后,可以在仓库里看到,已经多了一个111.txt文件

至此,本地到gitee仓库的环节已经打通,下一步,配置webhooks钩子程序,用来在本地每一次push代码到gitee仓库的时候,自动部署代码到我们的web的服务器

6、以下代码就是钩子程序,把这个钩子程序部署到自己的web服务器上,并且要外部可以访问

  1. public function index(){
  2. // 检测IP,gitee 180.76.198.77
  3. // if (!in_array($_SERVER['REMOTE_ADDR'], $allowIpArr)) {
  4. // echo '非法IP:' . $_SERVER['REMOTE_ADDR'];
  5. // exit(0);
  6. // }
  7. // 获取请求参数
  8. //$headers = getallheaders();
  9. $body = json_decode(file_get_contents("php://input"), true);
  10. // 请求密码
  11. $password = 'gwuido124wdgq4dmif';
  12. // 验证提交分支是否为master
  13. if (!isset($body['ref']) || $body['ref'] !== 'refs/heads/master') {
  14. echo '非主分支' . $body;
  15. exit(0);
  16. }
  17. // 验证提交密码是否正确
  18. if (!isset($body['password']) || $body['password'] !== $password) {
  19. echo '密码错误';
  20. exit(0);
  21. }
  22. // 验证成功,拉取代码
  23. $path = $body['project']['path'];
  24. $command = 'cd /var/www/html/' . $path . ' && git pull 2>&1';
  25. $res = shell_exec($command);
  26. return json($res);
  27. }

获得访问地址https://test.mylifestyle.top/hooks

然后就把这个访问地址复制,去gitee的仓库详情-管理-添加webhook

填写到url地址栏,然后点击添加按钮

7、在我们自己的web服务器去生成公钥,然后把公钥内容复制到gitee仓库-管理-部署公钥管理,生成公钥的方法请按SSH 公钥设置 | Gitee 产品文档所说的去做,这里不赘述

8、然后在我们自己的web服务器上去git clone git@gitee.com:xiaoxiaogui/test.git

9、这里基本上就完成了,照理说之后windows本地每一次提交的时候,gitee就会回调我们设置的webhook的钩子程序去同步代码到我们的web服务器上,但是实际却会报

error: cannot open .git/FETCH_HEAD: Permission denied

这个时候是因为.git文件夹的权限问题,只需要cd到test目录下,给git目录加权限

  1. chmod -R 777 .git/
  2. chmod -R 777 .

然后继续,你是不是觉得这下肯定万无一失了?错!大坑来了,又报个这个

  1. Host key verification failed.
  2. fatal: Could not read from remote repository.
  3. Please make sure you have the correct access rights
  4. and the repository exists.

10、这就很让人费解,因为自己手动在服务器上执行git pull都可以,但是通过本地push的方式gitee回调钩子程序中确是要报这个错,就很坑。原来是我们在第7步生成公钥的时候,是生成的root用户的公钥,然而php运行时并不是root用户!怎么破?于是我写了个php程序,把运行时使用的.ssh目录打印出来

  1. public function test(){
  2. //查看php执行git命令时所处的用户目录
  3. $command1 = 'cd ~/.ssh && pwd';
  4. $res1 = shell_exec($command1);
  5. return json_encode($res1);
  6. }

打印结果

/usr/share/httpd/.ssh

网上很多人说,php一般在/var/www/html下运行,所以把/root/.ssh下的公钥文件和know_hosts文件复制过来就是了,并且也不讲原因,导致我走了好多弯路啦,还是这个程序靠谱,建议大家都用程序打印实际执行目录,显而易见,我这里应该把/root/.ssh下的文件移动到/usr/share/httpd/.ssh下,于是执行指令

cp /root/.ssh/* /usr/share/httpd/.ssh/

11、然后windows本地修改一个文件,push 到gitee,查看webhook的请求历史

  1. From gitee.com:xiaoxiaogui/test
  2. aa0b584..95b3bd8 master -> origin/master
  3. Updating aa0b584..95b3bd8
  4. Fast-forward
  5. application/index/controller/Index.php | 1 -
  6. 1 file changed, 1 deletion(-)

嗯,搞定

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/488111
推荐阅读
相关标签
  

闽ICP备14008679号