zoukankan      html  css  js  c++  java
  • 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)。

  • 相关阅读:
    stm8s103 EEPROM烧程序时能否保留
    NEC芯片特别说明
    pic中断特别说明
    删除排序链表中的重复元素 II
    被围绕的区域
    计数二进制子串
    简单工厂模式
    打家劫舍 II
    打家劫舍
    相同的树
  • 原文地址:https://www.cnblogs.com/hpcpp/p/7389783.html
Copyright © 2011-2022 走看看