美文网首页我用 Linux首页之约程序员
代码部署的那些事(二)——Git钩子同步

代码部署的那些事(二)——Git钩子同步

作者: liuchungui | 来源:发表于2018-06-14 21:25 被阅读86次

    前面说了代码部署的那些事(一)——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钩子

    相关文章

      网友评论

        本文标题:代码部署的那些事(二)——Git钩子同步

        本文链接:https://www.haomeiwen.com/subject/fvhueftx.html