写代码的时候,git push到远程代码库后,每每还要连到服务器上pull代码才能进行测试。代码push后自动更新测试服务器的代码也算是一种刚需了。
git
git自己具有hook机制,能够接收代码前或者更新代码后调用自定义的脚本。这个脚本在{{代码仓库}}/.git/hooks目录下。以下图:/home/htdocs/lost为git代码仓库,lost下面.git/hooks目录为git的回调脚本。经常使用的有pre-commit改脚本在提交前执行,能够作一些提交的验证工做。还有一个post-receive,该脚本在代码提交后执行,自动更新远程服务器的代码就用到这个脚本。vim
搭建git开发环境,gitlab估计是不二之选。gitlab托管的仓库,代码更新后怎么触发git的hooks脚本呢。7.5版本后的gitlab能够这么作。bash
在gitlab的git-data里面的代码bare仓库里面建立一个custom_hooks目录,将git的hooks下面的脚本放到这里便可。git-data的目录根据安装方式不同位置会不一样。我是经过yum安装包的方式安装,目录在这里。/var/opt/gitlab/git-data/repositories/` username `/lost.git 。hooks脚本的完整路径为: /var/opt/gitlab/git-data/repositories/` username `/lost.git/custom_hooks服务器
脚本内容很简单:ssh到目标服务器执行git pull 命令便可。post-receive要有可执行权限,属主为git。ssh
#vim post-receive ide
#!/usr/bin/env bash # function: deploy git repo to stgging server # author: Chenchao Gao # date: 2015/10/29 ssh root@10.10.10.1 "cd /home/htdocs/lost;unset GIT_DIR && git pull origin master" >>/tmp/git-hook.log 2>&1
代码中的unset GIT_DIR是关键,取消GIT_DIR这个变量,不然cd的路径将不能按预期工做。git pull origin master 是明确从远程仓库更新到本地的master分支。一般git pull便可,可是若是是第一次pull代码,将会提示不能肯定merge哪一个分支的错误。gitlab
上面的代码有一个小小的坑。gitlab调用这个脚本是用git这个用户来执行的。因此ssh root@10.10.10.1这个用户公钥认证的话,应该是本地服务器git用户到10.10.10.1的root用户。不然将报公钥认证失败的错误!post