前面说了代码部署的那些事(一)——SFTP上传代码,今天就说说通过Git钩子同步
代码的流程吧!我这里做出的效果很简单,就是当后端提交代码之后,能自动拉取,从而实现了一个同步的效果。
需要注意的是,此场景中git和代码是放在同一台服务器。若是需要跨服务器更新,则可以加上Fabric实现。
Git钩子
整个核心流程是使用了Git钩子,钩子分成两种,一种是客户端的钩子,另外一种是服务端的。我们这里使用的是服务端的钩子,服务端钩子有三个:pre-receive
、update
和post-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用户
网友评论