自动化部署流程:
流程
在github上设置hook(钩子),本地推送代码到github,会触发hook,github请求web服务器的webhook.php文件,服务器通过文件执行pull命令,拉取github最新代码。完成自动化部署.
第一次本地推送远程,就会触发hook,服务器尚未有webhook.php文件,因此触发失败,需要服务器手动拉取代码
1.本地创建webhook.php
使用纯php、若时候其他框架只需配置路由,配置控制器方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <?php //GitHub Webhook Secret //GitHub项目 Settings/Webhooks 中的Secret 改 $secret="liminzhang"; //Path to your respostory on your server. //e.g. "/var/www/respostory" //项目地址 改 //$path="/www/wwwroot/xj.houdunren.com"; $path="http://hdxj.houdunren.com/webhook.php"; //Headers deliveried from GitHub $signature=$_SERVAR['HTTP_X_HUB_SIGNATURE']; if($signature){ $hash="sha1=" . hash_hmac('sha1',file_get_contents(" php://input"),$secret); if(strcmp($signature,$hash)==0){ echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1"); exit(); } } http_response_code(404); ?>
用的时候需要改webhook.php中的secret
和$path
,两者都来自gitHub->webhook的设置
2.github:
项目设置-》webhooks->add webhook 需要填写web服务器地址
Payload URL
http://hdxj.houdunren.com/webhook.php(请求文件的地址)
Secret
liminzhang(自己随便设置)
3.服务器:
宝塔面板中创建一个服务器地址。
远程操作
ssh root@hdxj.houdunren.com -p 71 //p是port端口
password:
1 2 3 4 5 6 7 8 9 10 cd / cd www ls cd wwwroot 该目录放置宝塔中创建的站点目录 cd hdxj.houdunren.com ls -a 有.user.ini(定义这个站点可以访问哪些目录)和.htaccess两个隐藏文件 mv hdxj.houdunren.com hdxj.houdunren.com999 修改文件名,因为目录不为空无法克隆github的代码,这时候hdxj.houdunren.com已经访问不了了(我想知道改名后目录边控了吗?) 克隆代码,使用https的方式 git clone https://github.com/houdunwang/hdxj.git hdxj.houdunren.com 后面的目录必须为hdxj.houdunren.com因为访问的时候,是走这个目录的
另 :
开启服务器php的执行命令函数(宝塔),软件管理-》php7.2(因为站点使用的是7.2)-》设置-》禁用函数(将shell_exec()删除)
root登录时
#sudo -u www git pull
www是web服务器的账号执行git pull
命令报错无权限。其实需要指需要修改权限,返回wwwroot目录删除hdxj.houdunren.com ,重新克隆
1 2 3 4 5 6 7 8 9 10 11 rm -rf hdxj.houdunren.com git clone https://github.com/houdunwang/hdxj.git hdxj.houdunren.com cd hdxj.houdunren.com ls -a 查看权限 ll -a //权限都是root 由于github上会使用apache或者nginx服务器账号去发送请求,但都无权限改动服务器文件.而webhook.php拉取代码的时候用的是www账号,所以需要修改权限 chown -R www . chmod -R g+s . 正常了