利用Git Hooks自动部署

Git是目前世界上最先进的分布式版本控制系统(没有之一)。开发者需要将提交到Git服务器上的代码进一步部署到Web服务器上。如果能够在提交代码到Git服务器的同时进行代码的自动部署则是最方便不过了。这篇文章中将会提供一个使用Git hooks进行自动部署的实例。

Git hooks

Git hooks是在 Git 仓库中特定事件(certain points)触发后被调用的脚本。通过钩子可以自定义 Git内部的相关(如 git push)行为,在开发周期中的关键点触发自定义的行为。Git 含有两种类型的钩子:客户端的和服务器端的。客户端的hooks由诸如提交和合并这样的操作所调用,而服务器端hooks作用于诸如接收被推送的提交这样的联网操作。Git服务器的搭建以及相关操作参照搭建Git服务器

自动部署理论

首先要明确代码的分布情况,开发者电脑上的本地仓库、Git服务器上的远端仓库、web服务器上的另一个本地仓库(浏览器访问的就是这里的代码)。实现自动部署就是要当从开发者本地仓库提交代码到远端仓库的时候,自动把代码部署到web服务器的本地仓库,实现开发者本地仓库和web服务器的本地仓库的同步(即通过Git hooks中的post-receive脚本文件)。本文的Git服务器和Web服务器是同一台服务器。

原理与流程

  1. 用户在客户端执行git push操作
  2. 远程仓库发现有用户执行了push操作,就会执行一个脚本post-receive
  3. 在post-receive脚本中,将git仓库的代码拷贝到web站点目录下

创建Git仓库

在服务器端上创建Git仓库,有两种方式:

  1. Git普通仓库
git init /path/to/test.git
  1. Git裸仓库
git init --bare /path/to/test.git

两者区别:

普通git仓库的目录结构就和代码目录结构一致,只多了.git目录。.git目录中包含了git的一些配置等信息。裸仓库只保存了一些配置信息等,肉眼找不到上传的代码。

Git普通仓库和Git裸仓库的hooks所在位置不同。Git普通仓库hooks在.git/hooks/中,Git裸仓库hooks在hooks/中。hooks要做的事就是将代码从仓库中拷贝到web目录。

编写Git hooks脚本

在上述hooks目录中,创建post-receive文件,添加内容如下:

#!/bin/sh

DEPLOY_PATH=写Web站点目录

#将 master 以zip格式打包到指定文件(裸仓库中执行)
echo "git账号的密码" | sudo -S git archive --format zip --output file.zip master

#将打包好的剪切到web目录
echo "git账号的密码" | sudo -S mv file.zip $DEPLOY_PATH

unset GIT_DIR
cd $DEPLOY_PATH
echo "git账号的密码" | sudo -S unzip -o file.zip 
echo "git账号的密码" | sudo -S rm -rf file.zip 
echo "git账号的密码" | sudo -S chown www:www -R $DEPLOY_PATH

保存后赋予可执行权限:

sudo chmod  +x  /path/to/test.git/hooks/post-receive
sudo chown -R git:git /path/to/test.git

这里使用echo "git账号的密码" | sudo -S Command 是为了解决出现remote...Operation Not Permitted问题。

然后通过Git Bash在本地对远程仓库进行增加或删除修改操作,接着执行git push相关命令之后,便可完成代码的自动部署。关于Git Bash的相关内容可查看使用Hexo-Vexo搭建个人博客的安装git节。

拓展

在做项目的时候,Git服务器和Web服务器往往会分离,而且Web服务器往往不止一台。博客利用Git Hooks与rsync集群部署是一个使用Git hooks与rsync进行集群自动部署的实例。

参考链接

1.用 Git 钩子进行简单自动部署
2.使用 Git Hook 实现网站的自动部署
3.git hook实现代码自动部署

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • Git 命令行学习笔记 Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来...
    sunnyghx阅读 3,972评论 0 11
  • 腿上长了7颗虫 没有传染 只是很痒 从山上带回来一些身体上的记忆 提醒着自己 提醒着自己 那些伤口即使你撕碎了 也...
    请关好门阅读 264评论 0 0
  • 这几天每到傍晚,宁波北仑沿山公路上的林苑山庄车水马龙、人山人海。一眼望去,整个山庄灯火辉煌、璀璨夺目,3000万盏...
    北仑情阅读 703评论 0 0