网站里的文件成千上万,不可能每次改几十个文件就把整个网站用FTP重新上传一遍,但每次改了哪些文件,想记住也不是一件简单的事情,并且这些修改过的文件分散在很多不同的文件夹里,一个一个找出来上传更麻烦。
那么大家都是如何精确地每次都能很方便地只上传那些改动过的文件的呢?
PS. 我现在的做法是在本地开发环境上安装git, 在远端服务器上也安装git,然后这边push,那边pull。但是还需要telnet或者ssh到远端才能pull,有没有更加自动的方法,这边push之后,服务端自动就更新了?想听听大家的建议。
世界只因有你2017-05-02 09:29:07
感谢 @Cocbin 的提醒,据此仔细研究了Git的hook原理,然后根据我的项目做了以下事情:
首先,因为我是把项目部署在github网站上,所以不需要自己设置复杂的hook,而只要使用github自带的webhook就可以了。webhook会在你push到github时激发一个你设定的回调url,然后你在这个url里执行pull操作即可。
另外,在你的服务器上,不要使用开发者自己的ssh key来pull,而应该生成一个deploy key,放到github里面,这个key是不需要手动输入密码的,专用于从github pull内容下来,这样就彻底完成了自动部署。
我另外还看了Hudson和Jenkins,也都是很不错的工具,如果是做Java项目的话,应该是使用Jenkins,因为Hudson被Oracle收购之后,逐渐变得不再开放。但因为我的项目是php的,犯不着为了这个再装一套Java8,所以没有考虑,但其实也有专门的Jenkins for PHP,但对我来说感觉还是太重了,也许等以后项目再大一些的时候考虑使用吧。
以上就是一些心得,希望对有同样问题的同学有帮助。
---------- 这里是华丽丽的分界线 --------------------------
补充:
实际操作过程远比想象中复杂,以下是代码:
$sReqData = file_get_contents('php://input');
try {
$payload = json_decode($sReqData);
} catch (Exception $e) {
exit(0);
}
if ($payload->ref === 'refs/heads/master') {
exec('cd /var/www/your_repo; git pull;');
}
这时候当有push上传时,github会回调,但问题是由于回调时用的是apache这个用户名,不是你ssh进去时用的那个用户名,所以你会发现apache这个用户名对于那个目录没有操作权限:error: cannot open .git/FETCH_HEAD: Permission denied
所以你需要先把ssh_user加到apache组中:
usermod -a -G apache ssh_user
然后修改权限:
chmod -R g+w /var/www
chown -R ssh_user:apache /var/www
chmod -R g+s /var/www
之所以放在这个目录,是因为apache这个用户的缺省目录就是/var/www,当然你可以把它改到另外一个目录下,可能会更安全一些。
然后:
sudo -u apache git pull
它会在apache的.ssh文件夹下产生一个known_hosts
文件,然后如果你是用的ssh方式,你还需要把上面生成的deploy key里的两个文件id_rsa
和id_rsa.pub
拷到.ssh文件夹里去。然后反复多执行几遍以下命令,确保不再报任何错误。然后就可以尝试从客户端push一个新版本上去,看是否可以自动部署成功了。
================ 国内版 =====================
因为Github的服务器不在国内,所以经常会造成无法push/pull的麻烦,所以考虑迁移到国内的git.oschina.net上。迁移过程不细述。只是有个别地方需要注意一下:
关于webhooks的代码:
$sReqData = $_POST['hook'];
try {
$payload = json_decode($sReqData);
if ($payload->password === '这里是你的密码' && $payload->hook_name === 'push_hooks') {
exec('cd /var/www/your_repo; git pull;');
}
} catch (Exception $e) {
exit(0);
}
关键一步要执行,我被卡在这里找不到原因很久:
sudo -u apache git pull
黄舟2017-05-02 09:29:07
说一下我用过的办法:
1、首先你得有一个版本控制服务和rsync服务
2、从版本服务器迁出需要部署的稳定版本代码到一个临时文件夹
3、将rsync的服务端目录指定到临时文件夹
4、使用rsync命令将服务端目录同步到你的部署目录
5、写一个shell:update版本代码到临时文件夹(增量),对临时文件夹文件做一些更新操作(如果需要的话),rsync同步临时文件夹文件到部署目录(增量)
上述流程做完了之后,每次提交代码,只需要运行一次上述第5条的shell即可。
虽然有点麻烦,但比较有效,不喜勿喷。