使用git hooks钩子实现gitlab的代码服务器自动更新

实现钩子自动触发流程图:

因为不是直接走的服务器的远程库所以不能直接使用git hooks触发,需要一个裸库做跳板。

原理,当本地提交Git库B的代码到远程gitlab库的时候,同时提交本地git库A的代码到服务器端git库A触发hooks钩子,服务器端触发脚本进入到git库B中进行git pull代码的操作,以至于实现服务器端自动更新gitlab的功能。

一:服务器端操作

1、把服务器的公钥加到云端gitlab上,实现git更新权限 添加方式可以查看 添加公钥 

2、创建一个服务器普通用户

adduser frank #添加用户

passwd frank #更改密码

3、 收集用户公钥,创建证书登录

然后将所有连接用户的公钥保存在 authorized_keys 中,就是本地生成的公钥串,一行一个。

登录frank账户或者直接切换成frank的账户操作下面的命令。

cd /home/frank/
mkdir .ssh
chmod 755 .ssh
touch .ssh/authorized_keys
chmod 644 .ssh/authorized_keys

3、使用frank用户进入服务器使用 ssh 的方式clone git库B的代码

如果是这个项目是其他账号clone的可能会存在权限限制问题,比如是root下载的项目,想使用frank账户更新会得到类似下面的这种报错,有以下解决方案

报错

error: cannot open .git/FETCH_HEAD: Permission denied

方案1、重新使用frank账户clone项目

方案2、进入到项目对 .git/FETCH_HEAD 做 666提权 

chmod 666 .git/FETCH_HEAD

方案3、直接把 .git目录改成 775权限

4、创建服务器git裸仓库A

mkdir mycode
chown frank mycode/
cd mycode
git init --bare test.git             #初始化仓库
chown -R frank test.git              #更改所属用户

5、创建git裸库A的/test.git/hooks钩子脚本vim post-receive,保存退出

cd /mycode/test.git/hooks/

vim post-receive

#!/bin/sh

unset GIT_DIR

#进入代码库B
cd /var/....../frank/文件夹名

#执行git pull命令
git pull

#返回仓库A并退出
cd /var/....../frank/mycode/test.git
exit 0

6、赋予权限

chmod +x post-receive

二:本地操作

1、本地clone git裸库A

git clone 服务器账号名称@服务器IP:自建的git地址

2、本地clone git库B

3、本地创建一个shell脚本方便快捷提交与触发钩子

#!/bin/sh

##提交git库B
git pull

git add Whitelist.php

git commit -m '测试钩子'

git push origin master

##进入本地git库A
cd /Users/.......xin/mycode/test

echo "`date +%s` $@" >> test.txt

##触发A服务器钩子
git add test.txt
git commit -m 'test'
git push origin master

当然了如果想做更多的事,比如重启一些服务器配置等,可以直接使用root账户来做

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值