在刚开始用git的时候,每次都是将本地将代码push到远程仓库,而后再ssh到服务器上git pull,甚是麻烦。后来在项目开发中使用git的时候,发现push以后,编译系统居然会有自动部署等功能。顿时以为这等神器,必须学习一下,因此就请教了吴旭东老师。下面就是我经过Git Hook神器将本身的项目自动化部署到服务器的过程。html
首先要明确如今代码的分布状况,开发者电脑上的本地仓库,git服务器上的远端仓库,web服务器上的另外一个本地仓库,咱们浏览器访问的就是这里的代码。其实自动部署就是要当从开发者本地仓库提交代码到远端仓库的时候,自动把代码部署到web服务器的本地仓库,实现开发者本地仓库和web服务器的本地仓库的同步。(即经过GitHook中的post-receive脚本文件)node
在服务器上建立一个裸仓库(git服务器上的远端仓库)git
首先要在服务器上创建一个裸仓库,我存放裸仓库的目录是/home/gitbook,进入到该目录,而后使用git init --bare 裸仓库名称 建立裸仓库。
裸仓库的仓库名称通常会加上.git结尾的形式,如 hello.git (这也是为何咱们从 GitHub clone 仓库的时候,地址都是 xxx.git 这样的形式的缘由)web
在服务器上创建一个普通Git仓库用于存放网站的源代码。(web服务器上的另外一个本地仓库)npm
mkdir /home/www/ cd /home/www/ git clone /home/gitbook/hello.git hello_project #hello_project是自定义的Web项目名称
配置自动部署Git Hook浏览器
进入到/home/gitbook/hello.git/hooks文件夹,使用vi post-receive建立一个脚本,当你在本地仓库执行git push后就会触发post-receive。
post-receive的内容以下:服务器
#!/bin/sh #判断是否是远端仓库 IS_BARE=$(git rev-parse --is-bare-repository) if [ -z "$IS_BARE" ]; then echo >&2 "fatal: post-receive: IS_NOT_BARE" exit 1 fi unset GIT_DIR DeployPath="/home/www/hello_project/" echo "===============================================" cd $DeployPath #进入web项目目录 echo "deploying the web project" #git stash #git pull origin master #不建议使用git pull,后面会有解释 git fetch --all #这里使用git fetch进行拉取,不建议用git pull git reset --hard origin/master #gitbook build #这里的gitbook是一个电子文档管理软件,用于生成好固定格式的电子文档,通常用户到,若须要则需另行安装,因为gitbook是node.js写的,而npm是node.js的包管理器,因此要先安装npm再安装gitbook。gitbook build表示文档生成在当前目录的默认文件夹_book里面。 #sleep 15 #gitbook执行须要8秒钟时间,等待15秒是为了确保能获得返回结果 time=`date` echo "web server pull at webserver at time: $time." echo "================================================"
保存后赋予可执行权限:ssh
chmod +x /home/gitbook/hello.git/hooks/post-receive
这样在开发者提交代码的时候,就会自动部署。post
在这里须要解释两个问题:学习
在这里我使用的是git fetch,为何没有用git pull实现。区别在于:
(1)git fetch:至关因而从远程获取最新版本到本地,不会自动merge。
(2)git pull:至关因而从远程获取最新版本并merge到本地。
(3)pull实现至关于fetch后再用merge,来合并本地和远端的代码。
这里就有个问题,若是开发者在提交过程出现失误,使用git reset复位后,如今远端的代码版本低于web端的代码版本,再使用pull的时候就不能实现和开发者本地的代码的同步。因此这里使用fetch后,在强制使用reset实现web端的代码版本指针和git服务端的一致。(若是在本机可使用stash,而后pull,而后drop刚才stash的内容)
gitbook build
前面的注释,可是仅添加这一行的话会致使最后这个脚步执行失败,由于build须要大约8秒时间。因此个人解决方案是在脚本中添加sleep 15
,这样能够等待build执行结束并把结果返回到显示的终端。(若是只是须要自动更新项目,请把这两行指令删去)以上基本转自:http://blog.csdn.net/wsyw126/article/details/52167147
其余相关:
ssh免密钥
du -sh * 查看文件和目录大小