Git提交代码实现WEB自动部署填坑记

原创 tiangr  2017-03-02 23:59  阅读 169 次

最近一直在熟悉使用Git进行版本控制,基本上把服务器部署Git,和Git命令都熟悉了一遍,已经可以实际用在版本控制的流程中了。由于之前一直使用SVN做版本控制,所以也是使用svn来做自动部署的工作,仔细看了下Git的实现方法,也和SVN一样,要用到钩子。但是在实际部署过程中还是踩了很多坑,现在记录下来,让大家不要犯同样的错误。

一 git机制简要介绍

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

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

二 自动部署原理

说说现在代码的分布情况,开发者电脑上的本地仓库,git服务器上的远端仓库,web服务器上的另一个本地仓库,我们浏览器访问的就是这里的代码。

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

三 实现自动部署

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

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

post-receive

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

安装过程

  1. 在服务器上创建一个裸仓库(git服务器上的远端仓库)。首先要在服务器上建立一个裸仓库,我存放裸仓库的文件夹是/home/workspace/gitbook,进入到该文件夹,然后使用git init –bare springSummary.git创建裸仓库。
  2. 在服务器上建立一个普通Git仓库用于存放网站的源代码。(web服务器上的另一个本地仓库)
    1. mkdir /var/www/workspace
    2. cd /var/www/workspace
    3. git clone /home/workspace/gitbook/springSummary.git
  3. 配置Git Hook
    进入到/home/workspace/gitbook/springSummary.git/hooks文件夹,使用vi post-receive创建一个脚本,当你在本地仓库执行git push后就会触发post-receive。
    post-receive的内容如下:

    1. #!/bin/sh
    2. #判断是不是远端仓库
    3. IS_BARE=$(git rev-parse --is-bare-repository)
    4. if [ -z "$IS_BARE" ]; then
    5. echo >&2 "fatal: post-receive: IS_NOT_BARE"
    6. exit 1
    7. fi
    8. unset GIT_DIR
    9. DeployPath="/var/www/workspace/springSummary"
    10. echo "==============================================="
    11. cd $DeployPath
    12. echo "deploying the test web"
    13. #git stash
    14. #git pull origin master
    15. git fetch --all
    16. git reset --hard origin/master
    17. time=`date`
    18. echo "web server pull at webserver at time: $time."
    19. echo "================================================"

    保存后赋予可执行权限:

    1. chmod +x /var/www/workspace/springSummary/hooks/post-receive

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

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

坑一,文件权限:

首先你在服务器端创建仓库的Git用户加入到WEB服务器的用户组,一般是www。然后就是WEB网站文件的权限,强烈建议代码在初始推送到仓库时,尽量选择在Linux系统下,并把文件权限设置好,如果你在windows上把项目的文件推送到服务端的裸仓库,在后面网站文件自动更新的时候就会自动修改文件的权限。

在上面的第二步中使用Git Clone 拉下来代码后一定要把文件权限改成组可写,并文件拥有者都改成Git用户。

坑二,使用SSH连接远程库:

默认Git使用HTTPS连接远程仓库,如果改成SSH协议就可以免去密码。这样第三步的脚本拉取代码就不需要输入密码。点击这里可以查看如何使用SSH连接Git。

  1. git remote set-url origin [url]

使用这个命令可以修改已经存在的远程库地址

坑三,在已经存在文件的目录里没法使用Git clone:

如果你和我一样在web目录里已经有文件存在了, 就会提示错误信息:

  1. fatal: destination path '.' already exists and is not an empty directory.

解决的办法是:

进入非空目录,假设是 /workdir/proj1

  1. git clone --no-checkout https://git.oschina.NET/NextApp/platform.git tmp
  2. mv tmp/.git .   #将 tmp 目录下的 .git 目录移到当前目录
  3. rmdir tmp
  4. git reset --hard HEAD

坑四,使用SSH无法还是出现密码输入提示:

仔细检查你在服务器上的.ssh目录和authorized_keys的权限是否设置成了 700 和 600

参考文章:

http://blog.csdn.net/wsyw126/article/details/52167147

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

特别提示:本站资源全部免费下载,因服务器需经费维护,文中部分外链点击后会进入广告,请耐心等待5秒即可跳过广告进入目标页面。如遇页面外链打不开或下载地址失效,您可以在评论中指出错误,或扫描页面底部二维码。
本文地址:http://www.tiangr.com/git-ti-jiao-dai-ma-shi-xian-web-zi-dong-bu-shu-tian-keng-ji.html
版权声明:本文为原创文章,版权归 tiangr 所有,欢迎分享本文,转载请保留出处!

发表评论


表情