实现钩子自动触发流程图:
因为不是直接走的服务器的远程库所以不能直接使用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账户来做