以前作为一个野路子,写完代码直接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的代码。