使用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 切换到管理中 如图
2.2 设置WebHooks 入图
三、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种测试地址是否可以正常推送代码
结束语
本文有任何错误,或有任何疑问,欢迎留言说明。
网友最新评论