我只是用来备份我博客,并自动部署到我服务器上,也就是家里的N1盒子.

没用过啥Github,毕竟不是科班出身,也没在公司干过..

 

新建一个私有仓库

随便建,反正别人也看不到

 

 

 

设置webhook

下面有选项, 什么时候触发.

我设置的push的时候触发,也就是我向仓库提交代码的时候触发.

 

 

 

 

服务器环境部署

web代码

也就是webhooks访问的页面,我这里是PHP,然后通过PHP执行shell .拉取更新的代码

    public function go()
    {
        // webhook上设置的secret
        $secret = "*************";  //key
        // 校验发送位置,正确的情况下自动拉取代码,实现自动部署
        $signature = Request::server("HTTP_X_HUB_SIGNATURE");



        if(!empty($signature)) {
            $hash = "sha1=".hash_hmac('sha1', file_get_contents("php://input"), $secret);
            if (strcmp($signature, $hash) == 0) {
                set_time_limit(3 * 60); //最大过期时间3分钟
                $shellPath = "/data";
                $cmd = "bash /data/git_pull_web.sh";
                $res = $this -> doShell($cmd);
                //print_r($res); // 主要打印结果给github记录查看,自己测试时查看

                return json($res);
            }
        }else{
          abort(404, '页面异常');
        }
    }

    /*
    * 执行shell命令
    */
    protected function doShell ($cmd, $cwd = null) {
        $descriptorspec = array(
            0 => array("pipe", "r"), // stdin
            1 => array("pipe", "w"), // stdout
            2 => array("pipe", "w"), // stderr
        );
        $proc = proc_open($cmd, $descriptorspec, $pipes, $cwd, null);
        // $proc为false,表明命令执行失败
        if ($proc == false) {
            return false;
            // do sth with HTTP response
            print_r("命令执行出错!");
        } else {
            $stdout = stream_get_contents($pipes[1]);
            fclose($pipes[1]);
            $stderr = stream_get_contents($pipes[2]);
            fclose($pipes[2]);
            $status = proc_close($proc); // 释放proc
        }
        $data = array(
            'stdout' => $stdout, // 标准输出
            'stderr' => $stderr, // 错误输出
            'retval' => $status, // 返回值
        );

        return $data;
    }

 

 

shell脚本

cd /data/www/yakeblog
git fetch --all
git reset --hard origin/master
git pull
composer install

 

自己拉取的脚本测试下.

私有项目拉取有两种方式,1是账号密码,2是生成一个ssh密钥,把公钥传GitHub 个人设置里面

 

不香的地方

 

webhooks经常超时.