自动化部署

自动化部署流程:

流程

在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 .
正常了