利用github-Webhooks自动部署代码

现在市面上大部分的仓库工具都提供webhooks功能,当触发某些特定的事件时,仓库会向指定地址发送一个http请求,利用此功能可以自动拉取代码完成部署。

当你在github上新建一个仓库,在setting里可以看到webhooks设置,我们设置好需要发送请求的地址以及触发事件,默认是push事件,不清楚的话,设置里有文档,如果不需要很复杂的功能,简单看一下就行了。

当然,请求会有个验签的动作(可选),建议选上,为了安全考虑。代码很简单,文档里有示例,php代码可以这么写:

$headers = getallheaders();
$payloadBody = file_get_contents("php://input");
$signature = $headers["X-Hub-Signature"];
$secretToken = getenv("SECRET_TOKEN");
$verifyHashHex = "sha1=" . hash_hmac("sha1", $payloadBody, $secretToken);
hash_equals($signature, $verifyHashHex);

验证成功后,执行:

popen("cd /path/to/rep && git pull --rebase", "r");

整个流程就结束了,在webhooks设置里能看到每次仓库发的请求。

下面写写我在完成整个过程中遇到的问题,总结一下,如果有朋友看到了这篇文章,能帮到你就再好不过。

  1. 调试代码,可以先写一个demo,利用exec函数,将命令执行结果输出,可以帮助我们排查问题
    echo getenv("HOME");exec("whoami", $o);
    print_r( $o );
    exec("git pull --rebase 2>&1", $o1);
    print_r( $o1 );

    如代码所示,先输出执行用户,再将错误信息也输出到标准输出。

  2. 用户主目录修改,如果你用的apache,并且没有该过配置文件的User指令,那么上面whoami命令输出的结果就是daemon用户,而该用户的主目录是/sbin,后面我们ssh公钥设置不方便,所以建议修改/etc/passwd,将主目录修改。可以在/home下新建daemon目录。
  3. 上面说到ssh设置,如果我们的remote是ssh方式访问,那么daemon主目录下新建下公钥吧,ssh-keygen,新建.ssh目录,另外一点要将该目录的权限设置成其他人不可访问,也就是说其他人不要给权限,否则后面拉取代码会出问题。
  4. .ssh下手动添加know_hosts文件,因为第一次拉取会有交互,必须你输入yes才会生成know_hosts文件,代码会卡住。
  5. HOME变量,如1,输出HOME变量,如果是/root,那么
    putenv("HOME=/home/daemon/");
  6. “error: unable to unlink old index.html(???)”,出现该错误还是权限问题,daemo用户对代码目录没有wx权限,也是就是不能删除文件。赋予即可。
  7. “insufficient permission for adding an object to repository database .git/objects”, objects目录及里面的文件可能没有权限写入。
    chmod -R g+w .git/objects

     

我在整个过程中遇到了很多问题,不过总算是完成了,记录一下。