GIT服务器实现web代码自动部署

以前在一台vps服务器上面搭建了Git服务器,用来作代码管理,方便团队开发。可是问题也就相应的来了,使用git能够轻松的上传代码,而因为作的是web开发,每次还都获得服务器上把代码手动pull或者复制到网页所在的文件夹下,也就比较麻烦,不适合我这种懒人。git提供了hook机制,能够很容易的实现代码的自动部署。nginx

我的原创,版权全部,转载请注明原文出处:git

http://www.embbnux.com/2014/09/05/git_server_let_code_auto_deploy/web

一 git机制简要介绍浏览器

git使用的是代码仓库,git服务端有仓库,称为远端仓库,咱们clone下来的,本地也有一个仓库称为本地仓库。咱们commit的时候是把代码提交到了本地仓库,push时,是把代码提交到了远端仓库。pull的时候是把代码从远端仓库下载到本地仓库。服务器

代码仓库对代码的存储使用了版本指针,每一个提交的版本都对应一个HEAD指针,当前版本指针随着代码的提交而一直改变。post

二 自动部署原理fetch

说说如今代码的分布状况,开发者电脑上的本地仓库,git服务器上的远端仓库,web服务器上的另外一个本地仓库,咱们浏览器访问的就是这里的代码。spa

要实现自动部署,就是要当开发者从本地仓库提交代码到远端仓库的时候,自动把代码部署到web服务器的本地仓库,实现开发者本地仓库和web服务器的本地仓库的同步。.net

三 实现自动部署指针

按照上面说的,就是要在开发者提交的时候,自动触发脚本,脚本去实现web端代码的部署.

这里就得讲一下git的hook机制,当git服务器接到各类事件时触发,这里使用的hook是

post-receive

这个hook在git服务器受到push请求,而且接受完代码提交时触发。

具体代码体现:

在git远端仓库的hooks目录下新建post-receive文件:

#!/bin/sh  
   
#author: embbnux  
#Blog of Embbnux: http://www.embbnux.com  
   
#判断是否是远端仓库  
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="/var/web"  
   
echo "==============================================="  
cd $DeployPath  
echo "deploying the test web"  
   
#git stash  
#git pull origin master  
git fetch --all  
git reset --hard origin/master  
   
time=`date`  
echo "web server pull at webserver at time: $time."  
echo "================================================"

保存后赋予可执行权限:

1

chmod +x hooks/post-receive

这样在开发者提交代码的时候,就会自动部署。

在这里补充说明下: 由于我创建git仓库时用的是git用户 可是在自动部署时站点服务器采用的是nginx服务器的  git用户属于git组 nginx属于nginx组  因此在这里就是把post-receive设置成nginx组 若是不设置的话在站点目录下是没有办法更新文件的(会提示没有权限操做)

自动部署的时候,我这里使用的是git fetch,也可使用git pull实现,这里两个的区别主要是pull事先fetch后而后再用merge,来合并本地和远端的代码。可是有个问题,若是开发者在提交过程出现失误,使用git reset复位后,如今远端的代码版本低于web端的代码版本,再使用pull的时候就不能实现和开发者本地的代码的同步。因此这里使用fetch后,在强制使用reset实现web端的代码版本指针和git服务端的一致。因为没有使用merge,因此之后web端的代码就不能在服务器上直接更改了,对web端代码的各类改变都应该使用开发者电脑进行代码提交,否则会报错。

相关文章
相关标签/搜索