0224
0224
8天前 · 3 人阅读

前面说了代码部署的那些事(一)——SFTP上传代码,今天就说说通过Git钩子同步代码的流程吧!我这里做出的效果很简单,就是当后端提交代码之后,能自动拉取,从而实现了一个同步的效果。

需要注意的是,此场景中git和代码是放在同一台服务器。若是需要跨服务器更新,则可以加上Fabric实现。

Git钩子

整个核心流程是使用了Git钩子,钩子分成两种,一种是客户端的钩子,另外一种是服务端的。我们这里使用的是服务端的钩子,服务端钩子有三个:pre-receiveupdatepost-receive

pre-receive

预提交钩子,它是服务端最先调用的钩子,我们可以使用此钩子来指定强制执行的开发策略,例如拒绝一些糟糕内容的提交。

update

update钩子在pre-receive之后被调用,它们工作原理类似,它会在真实提交之前执行,可以拒绝提交。与pre-receive不同的是,它会为每一个准备更新的分支各运行一次。也就是说我们同时向多个分支推送内容,pre-receive只运行一次,而update则会为每一个分支各运行一次。

post-receive

此钩子在成功推送之后调用,可以用来更新服务和通知等等。例如,后端提交了接口代码,可以利用此钩子更新接口代码。

了解了上面几个钩子,我们选择了使用post-receive钩子来更新同步代码。

使用

1、创建一个接口仓库

# 进入目录
cd /home/git
# 创建api.get仓库目录
mkdir api.git
# 进入仓库目录,创建一个裸仓库
git init --bare api.git
# 将所有者更改为git
chown -R git:git api.git

上面就是创建一个服务端的仓库,然后本地就可以克隆了。需要注意是,一定要将api.git更改为git用户。如果想了解更多搭建git服务器,可以阅读廖雪峰老师的搭建Git服务器

2、克隆仓库

例如,我们接口在nginx配置的路径是/alidata/www/api,那么我们就先将接口的仓库克隆一份到/alidata/www目录里。

# 进入/alidata/www
cd /alidata/www
# 此处192.168.0.1是你远程git地址
git clone git@192.168.0.1:/home/git/api.git api
# 将api所有者更改为git
chown -R git:git api

注意:上面一定要将api这个接口目录的所有者更改为git,因为git钩子是以git用户执行脚本的。若是,其它用户的,git用户可能没有权限更新代码,从而导致失败。

3、post-receive钩子脚本

进入api.git/hooks/目录,编辑post-receive钩子脚本。

# 进入git hooks目录
cd /home/git/api.git/hooks
# 编辑post-receive脚本
vim post-receive

编辑的post-receive脚本的内容:

#检查当前脚本是否放在--bare仓库,也就是服务器仓库
IS_BARE=$(git rev-parse --is-bare-repository)
if [ -z "$IS_BARE" ]; then
        echo >&2 "fatal: post-receive: IS_NOT_BARE"
        exit 1
fi

# 更新对应分支
while read oldrev newrev ref
do
    if [[ $ref =~ .*/master$ ]];
    then
        # 拉取master分支代码
        cd /var/www/api/
        git checkout master && git pull origin master
    elif [[ $ref =~ .*/test$ ]];
    then
        echo "此处可以更新测试分支的代码"
    fi
done

post-receive的用户所有者更改为git

chown git:git post-receive

总结

重点需要将几个地方的所有者更改为git

  • git仓库需要所有者更改为git用户
  • 接口代码仓库,需要将所有者更改为git用户
  • post-receive脚本也需要将所有者更改为git用户

参考

自定义 Git - Git 钩子
GIT魔导之路——Git钩子

收藏 0
关键词: git 钩子 receive api post 代码
评论