centos7+php7+shell+git web钩子自动更新

2017-9-14 Frank

1. 环境

2. 实现方案

1.通过码云的wehooks添加URL为 http://mydomain/gitpull.php, 当有push的时候调用php链接。
2.创建php文件gitpull.php

system('sh /opt/scripts/gitpull.sh');

3.创建更新脚本

#!/bin/sh
cd /myproject
git pull

到这里貌似成功了,但是发现返回空白脚本没有执行。

3. 问题解决

这时候想应该是权限的问题。
给gitpull.sh一个最高权限

chmod 777 gitpull.sh

然而依然不执行。也没有报错,如果有错误提示会省事很多。后来问题解决了才发现是可以输出错误信息的!如下:

system('sh /opt/scripts/gitpull.sh 2>&1');

查看执行用户,php查看

echo shell_exec("id -a");

或者通过查看php配置文件

more /etc/php-fpm.d/www.conf

发现用户是apache,需要给该用户添加权限,通过visudo 添加

%apache ALL=(ALL:ALL) NOPASSWD:/usr/bin/git pull

保存并推出,注意测试时注意浏览器缓存。

因为之前用root更新的所以还要修改项目所属用户

chown -R apache:apache myproject

还需要为apache添加部署密钥,当然先要生成密钥,我们用sudo来避免该操作。

sudo /usr/bin/git pull

避免git自带环境变量影响,shell脚本还要添加

unset GIT_DIR

最终脚本是这样的
1.gitpull.php

$p = file_get_contents("php://input");
if(!empty($p)){
    $p = json_decode($p,true) ;
    if(!empty($p["password"])&&$p["password"]=="mypassword"){
        echo "<pre>";
        echo "start" ;
        echo "<br/>" ;
        $last_line = system('sh /opt/scripts/diancai_gitpull.sh 2>&1',$retval);
        //exec('sh /opt/scripts/diancai_gitpull.sh') ;
        echo "end" ;
        echo "</pre>";
        echo '<hr />Last line of the output: ' . $last_line . '<hr />Return value: ' . $retval;
    }
}

2.gitpull.sh

#!/bin/sh
cd /myproject
unset GIT_DIR
sudo /usr/bin/git pull

参考
PHP中system()、exec()输出错误信息
gitlab webhook php exec 调用 shell 脚本。shell 脚本中调用 git pull 命令无法执行。
shell 脚本中git 命令不生效

发表评论 登录

Top