gitLab 全局hooks和custom_hooks,以及服务器端自动更新和备份(二)

1.利用custom_hooks的post-receive钩子,实现自动更新

打开另外一个终端,以管理员身份进入/home/hp/文件夹,新建一个文件夹git_backup,直接git clone一个项目下来,这里我clone的是自己的测试项目test。

打开之前的终端在custom_hooks文件夹下添加post-receive的shell脚本,没有后缀(以我的电脑路径为例:/var/opt/gitlab/git-data/repositories/root/Test.git/custom_hooks):

修改权限:chmod 777 post-receive

也可以修改为其他权限,但要保证它可以执行(gitlab官网上说,需要修改其所有者为git,我的电脑上不这样修改也可以执行,具体参看我的上一篇文章)。

#!/bin/sh
echo "custom post receive -------------->>"
dst=/home/hp/git_backup/Test
cd ${dst}
unset GIT_DIR
git --work-tree=${dst} pull origin master

切换到另外一个终端,修改/home/hp/Test目录及其所包含的文件属性

为了简化操作,我直接修改其属性(可以不需要这么多权限,起码要保证它可以执行),命令为: chmod -R 777 Test

2.用客户端git来测试

此时的客户端git和服务器端在同一台电脑上,只是目录不同,

客户端git目录在/home/hp/gitTest/Test

服务器git目录在/home/hp/git_backup/Test,如果是在两台电脑上就可以看到更清楚。

在客户端git目录下修改了文件,然后提交git commit -a,添加注释后提交到本地库,然后git push,就可以看到服务器端的custom_hooks的post-receive钩子被调用,执行了pull操作,这样就达到了自动更新服务器/home/hp/gitTest/Test的git库的目的。

 

以下部分可以跳过,我踩过的坑,记录一下————————————————————————————————————

3. 利用全局hooks中的post-receive实现批量更新

当时把hooks目录下的三个ruby版的钩子屏蔽了,此时每个项目对应的custome_hooks里的钩子不能生效,只能尝试用一种笨办法解决,就是用hooks文件下的全局钩子。如果在客户端push之后,post-receive被调用,这这里能调用每个项目的shell脚本去pull一遍,这样不就可以实现自动更新了么?

  思路:这里的post-receive可以是shell脚本,该脚本要实现的功能就是调用某一个目录下的所有shell脚本,并且执行一遍。

每个shell脚本要做的事情就是更新对应项目的文件。注意:hooks文件夹下原来的三个钩子文件不要删除,大家先做好备份,直接改后缀名,加上.simple

  思路有了,现在这用这样的笨办法解决:先建一个测试文件post-receive如下,修改其权限可执行

#!/bin/sh

for file in /home/hp/post_hooks_dir/*
do
    sh $file
done 

采用的是绝对路径,你可以在某个地方新建一个文件夹,然后用shell脚本去遍历你自己的目录,然后执行该目录下的shell脚本。

如果收到了remote: error: cannot open .git/FETCH_HEAD: Permission denied
这样的报错,就自己去修改需要更新的git仓库的文件的属性。

正常是是这样信息:

 

4.在原来的ruby版本的钩子执行我们的shell脚本

把3中的shell脚本写成一行,在ruby中调用,这样就可以不影响原来的ruby全局钩子。

参考写成一行的方法:http://blog.sina.com.cn/s/blog_ac843e330101c55g.html

在ruby中执行shell命令:http://www.jb51.net/article/59939.htm

我们采用的是system方法来执行shell命令

为不能删除hooks文件下的ruby钩子:http://blog.everants.com/jie-jue-gitlabbu-xian-shi-push-eventhe-xin-fen-zhi/

 可以采用在post-recevie的钩子里执行我们的shell脚本,就可以了。

在post-receive里添加一行

system 'for file in /home/hp/post_hooks_dir/* ;do sh $file;done'

这里的目录就是你自定义的目录/home/hp/post_hooks_dir/,用来统一存放所有需要执行的脚本,实现工程的自动更新。建议是按照工程名,建立同名的shell脚本,每个shell脚本的内容可以参考本文1中的,只需要自己改对应的文件路径即可。这样全局钩子,每次从客户端有push过来时,会调用hooks里的post-receive钩子,这个钩子里会去执行我们的那句shell脚本,然后这个脚本会去/home/hp/post_hooks_dir/执行所有脚本(每个脚本对应一个项目,进行git pull origin master)。

转载于:https://www.cnblogs.com/hpcpp/p/7389783.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值