以前作为一个野路子,写完代码直接FTP丢到服务器去,后来改用Git来管理代码,但是代码提交到Git服务器,总是要另外提交一份到Web服务器,或者连接服务器从Git更新代码,最近有空刚好研究了一下自动部署。
Git支持WebHooks,即本地写完代码后,直接push到git服务器,git服务器发现有代码提交,会自动post通知一个url,通过这个机制,可以让服务器在收到post请求后,自动pull拉取代码。

测试平台

CentOS 7.2
PHP 5.6
Gitee 码云

开始之前

1:以root用户,ssh登录到服务器
2:切换到Web的所有站点目录

cd /home/wwwroot/

3:给web服务的用户目录权限

chown -R www:www example.com/

4:切换到www用户

sudo su -s /bin/bash www

部署Git

www用户部署Git,不多赘述,Git基础

1:创建ssh公钥,并添加到码云的Git平台中

ssh-keygen -t rsa -C "xxxxxx@xxx.com
cat ~/.ssh/id_rsa.pub

2:服务器中初始化git

git init
git remote add origin git@gitee.com:user/www.example.com.git

3:必须先进行一次pull,此时会询问是否信任,输入yes后提交,如果不手动进行一次pull,在webhooks中将无法继续。

WebHooks

1:在码云的Git项目中配置WebHooks

勾选push后,项目收到的所有Push,都会通过Post提交给URL

2:Web服务端的响应代码,Web根目录新建hooks.php,内容为:

<?php
$data   = file_get_contents("php://input");
$data   = json_decode($data,true);

if($data['password'] == '123456'){
    shell_exec("
        cd /home/wwwroot/example.com && 
        git reset --hard HEAD && 
        git clean -f -d && 
        git pull origin master 2>&1
    ");
    exit;
}

接下来从客户端提交push试试呢?

注意

1:事先请一定检查是否有shell_exec执行权限,可以在php.ini或phpinfo()中查询
2:通过php来执行shell_exec来pull代码,一定要有足够的权限,即给www用户目录权限等,否则一定失败
3:WindowsServer+IIS的服务器我折腾了好久,没有成功,估计也是权限问题,给目录权限?phpcgi运行用户权限?iis中站点脚本执行权限?搞不太清楚,放弃了。
4:git pull的时候,如果本地代码和Git仓库的有冲突,是会失败的,所以在hook.php的代码中加入了reset和clean,所以如果有直接修改Web目录的代码并未手动push,在下次自动pull的时候,会丢失没有push的代码。