继续上一篇博客:http://www.jyguagua.com/?p=2658
上篇博客我们将Laravel的项目环境搭建完成,下一步我们来实现Laravel项目的自动部署工作,顺便将网站在阿里云展示出来。
首先开发好的代码,我已经提交到github上了,那么,我们需要下载到阿里云服务器上,后续网站的升级更新工作会非常频繁,我们也不希望每次代码提交一次,都要跑到阿里云服务器上执行一次git pull,非常繁琐,那么有无更好的办法?有,github提供了webhook方式,也就是说每次提交代码,github均会有事件信号,我们可以配置一个webhook脚本,来进行服务器端的代码更新工作。
原理如下:
默认的阿里云系统安装完成之后,默认只有root用户,为了安全考虑,我们应该新建一个用户进行日常的服务器端维护工作。本教程我们打算创建www用户,www组,将www用户放在www组来管理。代码的拉取工作,我们也一并让www用户来执行。
那么CentOS的组,用户创建还是比较简单的,我们通过如下命令,创建 www 用户以及 www 组。
#创建组 groupadd www #创建用户www到组www useradd www -g www
由于后续我们通过www用户进行webhook php脚本执行,所以,我们需要让系统默认的php-fpm, Nginx权限给www用户。
修改php-fpm的默认用户:
vim /etc/php-fpm.d/www.conf
修改其中user,group,改为如下:
user = www group = www
修改Nginx的默认用户:
vim /etc/nginx/nginx.conf
修改其中user部分:
user www;
修改好之后,重启php,nginx服务:
service php-fpm restart service nginx restart
重启之后,通过如下命令查看是否修改成功,如果php,Nginx默认用户均为www,那么便可以继续后续操作。
下面我们开始进行webhook的相关操作。
1:切换到www用户,创建部署公钥。
#切换到www用户 su - www #创建RSA密钥,一路回车,不要输其他任何东西 ssh-keygen -t rsa
完成上面步骤之后,添加密钥到github的项目部署密钥中。
添加完成后,在我们的网站根目录中,用www用户,把代码clone到根目录中。一定要确保是用www用户clone代码。小提示:只要看到shell终端是 www @ xxx,并且提示符是 $ ,那么肯定是 www 用户。
[www@xxx qadoor]$ git clone https://github.com/qadoor/qadoor_site.git
此处,还应该保证的是,网站的根目录,所属用户应该也是www用户,www群组,否则,会出现权限问题,比较麻烦,建议查看网站根目录,如果是www即可,如果不是,那么执行如下命令:
chown www:www *
确保是www用户权限:
代码克隆之后,我们在Laravel项目的public目录中创建hook目录,添加deploy.php文件,内容如下:
<?php #!/usr/bin/env /usr/bin/php error_reporting(E_ALL); ini_set('display_errors', '1'); set_time_limit(0); try { $payload = json_decode(file_get_contents('php://input'), true); //$payload = json_decode($_REQUEST['payload']); } catch(Exception $e) { //log the error file_put_contents('/var/www/qadoor/qadoor_site/logs/github.txt', $e . ' ' . $payload, FILE_APPEND); exit(0); } if ($payload['ref'] === 'refs/heads/master') { $project_directory = '/var/www/qadoor/qadoor_site/'; //$output = shell_exec("/var/www/qadoor/qadoor_site/public/hook/deploy.sh"); $output = exec("cd /var/www/qadoor/qadoor_site/ && /usr/local/git/bin/git pull"); //log the request file_put_contents('/var/www/qadoor/qadoor_site/logs/github.txt', $output, FILE_APPEND); } ?>
代码其实不难懂,阅读一遍,即可知道其中大概的内容,无非就是收到github推送过来的json信息,进行解析,然后判断无误,执行Linux命令即可。
其中执行的linux命令为:
cd /var/www/qadoor/qadoor_site/ && /usr/local/git/bin/git pull
大家根据自己的环境进行配置即可。
做好这些工作之后,我们把这个deploy.php添加到github项目中的webhook中。
点击edit即可看到每次push之后,github发送的一些json数据,我们的脚本也正是来解析这些json而已。不过在我的脚本里只是做了如果是master分支推送过来的消息,就执行一次pull,反正,达到目的就ok了。
下面进行一个测试:
参考内容:
webhooks相关:
https://developer.github.com/guides/managing-deploy-keys/
https://developer.github.com/guides/automating-deployments-to-integrators/
https://www.sitepoint.com/using-github-webhooks-php/
https://www.sitepoint.com/deploy-website-using-laravel-git/
https://jonathanstark.com/blog/deploying-code-automatically-with-github-webhooks
添加用户相关:
http://jingyan.baidu.com/article/414eccf64c0ea36b431f0afb.html
添加sudo操作相关:
http://jingyan.baidu.com/article/2a1383284bb3e8074a134f2d.html
配置权限相关:
http://www.cnblogs.com/argb/p/3604340.html
https://laravel-china.org/topics/2096
https://laravel-china.org/topics/2824
http://www.ilanni.com/?p=7438
文章的脚注信息由WordPress的wp-posturl插件自动生成