laravel 项目配合 gitoschina 设置webhooks 自动提交项目

ixibei 发表于 分类:git 阅读(2116) 评论(0)

简介:

使用laravel开发的项目,使用git做版本控制,用的是oschina的私有仓库,因为项目有些多,不想每个项目在修改了代码之后还要到服务器上pull一下,所以决定使用webhooks钩子自动pull提交的文件。下面就来介绍具体的实施步骤!…

使用laravel开发的项目,使用git做版本控制,用的是oschina的私有仓库,因为项目有些多,不想每个项目在修改了代码之后还要到服务器上pull一下,所以决定使用webhooks钩子自动pull提交的文件。下面就来介绍具体的实施步骤!


一、服务器配置

    1.1 项目所属组

        1.1.1 我跑php用的是www用户组,所以要确定项目文件是www 所在组 如果不是使用命令 chown -R www:www projects;


    1.2 生成www用户组git密匙

        1.2.1 使用 sudo -u www ssh-keygen -t rsa -C "xxx@xx.com" 生成www用户密匙文件,我的www用户根目录是/home/www

        1.2.2 如果上述命令提示.ssh文件不存在,则手动在 生成改文件夹 mkdir /home/www/.ssh 并且确定.ssh 文件夹必须是www用户组 可以使用chown -R www:www .ssh 设置

        1.2.3 命令执行成功可以发现 /home/www/.ssh 文件夹中生成了两个文件 id_rsa 和 id_rsa.pub 将id_rsa.pub打开,复制内容到oschina添加公匙 (确定两个文件是600权限)



二、oschina配置

    2.1 切换到管理中 如图

QQ截图20170508105209.png


    2.2 设置WebHooks 入图

        QQ截图20170508105346.png



     

三、laravel项目配置

    3.1 laravel中默认开启了csrf验证,在这里我们需要post提交数据,因此需要特别开发这个连接post不要csrf验证 在项目 app/Http/Middleware/VerifyCsrfToken.php 中设置

protected $except = [
        'pull', // 这里的地址就是2.2 图中提供的post地址 可以根据你项目不同更改
    ];

    

    3.2 routes.php文件中设置要对应的路由


    3.3 路由对应的 Controllers 中有以下下代码(主要用于验证提交的数据格式是否正确)

public function pull(){
        header("Content-type: text/html; charset=utf-8");
        if (! isset($_REQUEST['hook'])) die ('非法请求');
        $config = [
            'web_user' => 'www',
            'web_group' => 'www',
            'projects' => [
                'test' => [
                    'password' => 'xxxx',//步骤2.2 图中设置的密码
                    'web_path' => '/home/www/test',
                    'branch'   => 'master',
                ],
            ]
        ];
        $hook = json_decode($_REQUEST["hook"], true);//步骤2.2中 old format提供的数据格式
        $project = $hook['push_data']['repository']['name'];
        //判断密码
        if ($hook['password'] != $config['projects'][$project]['password']) die ("密码错误");
        //判断branch
        if (trim(strrchr($hook['push_data']['ref'], '/'), '/') != $config['projects'][$project]['branch']) die ("非自动部署分支");
        $shell = <<<EOF
            WEB_PATH='{$config['projects'][$project]['web_path']}'
            WEB_USER='{$config['web_user']}'
            WEB_GROUP='{$config['web_group']}'
             
            echo "Start deployment"
            cd \$WEB_PATH
            echo "pulling source code..."
            /usr/local/git/bin/git reset --hard origin/master
            /usr/local/git/bin/git clean -f
            /usr/local/git/bin/git pull
            /usr/local/git/bin/git checkout master
            echo "changing permissions..."
            chown -R \$WEB_USER:\$WEB_GROUP \$WEB_PATH
            echo "Finished."
EOF;
        file_put_contents('deploy.sh', $shell);
        $res = shell_exec("bash deploy.sh");
        $log_file = "{$project}.log";
        foreach ($hook['push_data']['commits'] as $commit) {
            file_put_contents($log_file,
                "※" . date('Y-m-d H:i:s') . "\t" .
                $project . "\t" .
                $commit['message'] . "\t" .
                $commit['author']['name'] . PHP_EOL,
                FILE_APPEND
            );
        }
        file_put_contents($log_file, $res . PHP_EOL, FILE_APPEND);
    }

    

    3.4 提交到服务器,然后在oschina webhooks种测试地址是否可以正常推送代码

结束语

本文有任何错误,或有任何疑问,欢迎留言说明。

本站文章除注明转载外,均为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。

http://www.onephper.com/archive/38.html

相关推荐

评论

回复给XXX取消回复

说点什么吧...

网友最新评论

输入关键字