Git实现代码自动部署

November 30, 2015

这段时间自己一直投身于Web的前后台开发,每每碰到需要部署到测试服务器或是线上服务器时,都是手工进行合并。但是这样会无形中增加我们部署的风险。而我们确实也由于这样的手动部署导致了不少线上问题。今天这里为大家推荐一个方法,就是利用push代码的时机对代码进行自动部署,这样我们每次只要有提交代码就会部署到测试服务器或者线上,方便快捷,降低出错率。

确定自动部署的时机

我们的代码采用的是Git Flow的形式,介于我们在本地开发测试,只有预发布状态才会进行线上部署,所以我们的时机就选择当master代码接收到push动作时触发。Git本身给我们提供了很多hook脚本来帮助我们在git的各个阶段做一些自定义的工作,由于我们是为了捕捉Git的push操作,所以git hook当然是我们的不二人选

git hooks是什么

git hooks==>钩子,在被特定的事件(certain points)触发后被调用。详细说明推荐大家参看git 官方给出的说明文档 git hooks 这里我们主要应用的是post-receive 这个hook脚本

这个hook脚本是服务端的hook,我们可以在git仓库的对应路径repositories/xxx.git/hooks中找到。初次进入时,我们可能会看到如下形式的目录结构 git_hooks目录结构 我们只需要将sample后缀去除,该hook就可正常工作

如何使用git hooks

根据git官方文档描述,我们需要的hook为post-receive,所以我们只需要将自己的事件添加至该文件即可.这里我们加入如下脚本

#!/bin/sh

#执行我们的工程的部署脚本
sh /web/git_hooks/xxx/post-receive

就是这么简单,这样每次当我们push代码到远程仓库时都会触发/web/git_hooks/xxx/post-receive脚本的执行

如何完成自动部署动作

我这里是将自动部署的动作全部放在了/web/git_hooks/xxx/post-receive脚本中了。其实接下来的工作就是shell脚本部分的工作了

#!/bin/sh

GIT=/usr/bin/git;
ROOT=/web/home/;
PROJECT_NAME=xxxx;
DEPLOY_BRANCH=master;

#切换到工程目录

if [ ! -d "$ROOT$PROJECT_NAME" ];then
cd $ROOT;
#对应的git仓库地址
$GIT clone git@amigoon.com:xxxx.git;
fi

cd "$ROOT$PROJECT_NAME";


$GIT checkout $DEPLOY_BRANCH;
$GIT pull origin $DEPLOY_BRANCH;

到此我们已经完成了自动部署的所有流程工作,当然在部署过程中我们可能还会碰到一些问题,在文章的最后我会列举一些注意事项供大家参考

注意事项

  1. git用户必须有部署目录的写权限
    由于git账号需要完成将目标代码clone至部署目录,所以必须拥有该目录的写权限。由于是代码部署目录,一般给777都行
  2. git用户必须有对代码仓库的访问权限
  3. git用户必须要有对部署脚本的执行权限

Comments