由于我们的代码有本地(每个开发人员的电脑),局域网,测试线上环境(及正式环境),相当于三端。
基本结构图如下:
代码管理流程图
1.安装线上git
yum install git #安装git
git --version #查看git版本
2.创建用于运行gitlab的用户git
adduser git #建立git用户
groupadd git #建立git用户组
usermod -G git git #将git用户加入git用户组同时从其他组移除
usermod -a -G root git #将git用户加入root用户组,有-a参数不从其他组移除,此时git同时属于git和root组
passwd git #为git用户设置登录密码
此处有些读者习惯用www用户部署web目录,那就以www用户运行git,这里不再赘述。
3.创建git仓库目录
cd /home/git #进入git用户目录
#确保git目录拥有者是git用户,不是就修改chown git:git /home/git -R
mkdir test.git #创建git仓库目录
cd test.git #进入目录
git init --bare #初始化仓库目录
cd ../ #返回上层目录
chown git:git test.git -R #修改git仓库目录拥有者为git
4.以同样的方式在局域网安装git,这里不再赘述
1.创建局域网和线上web目录
进入局域网服务器:
cd /home #示例是在/home目录下,读者可以自行选择
mkdir www #创建www目录用于放web
chown git:git www -R #拥有者改为git
chmod 755 www -R #权限设为755
www目录就创建完了,将nginx以git用户运行,修改nginx.conf文件,在文件头部:
user git; #以git身份运行
重启nginx。
注意这里要操作两次,线上也要以同样方式创建www,还要在www中手动创建test目录,进入线上服务器:
cd /home #示例是在/home目录下,读者可以自行选择
mkdir www #创建www目录用于放web
mkdir www/test #线上要自己创建test目录
chown git:git www -R #拥有者改为git
chmod 755 www -R #权限设为755
2.克隆线上仓库
进入局域网服务器:
su - git #切换为git用户
cd /home/www #进入www目录
git clone git@{线上ip}:test test #克隆线上仓库到test目录
此时会提示输入密码,输入我们刚刚设置的git密码就可以克隆成功。但是如果没有设置git密码,或者即使设置了密码,每次连接线上git库都需要输入密码,这是一件很头疼的事,所以需要免密码连接。
3.ssh免密码验证连接
进入线上服务器:
su - git #切换至git用户
cd /home/git #进入git目录
ssh-keygen -C '[email protected]' -t rsa #为你生成rsa密钥,可以直接一路回车,执行默认操作
生成密钥后,会出现
.ssh
├── id_rsa
└── id_rsa.pub #公钥 服务端需要里边内容验证连接着身份
接着修改权限:
chmod 700 /home/git/.ssh
此处要确保你的RSA认证是打开的!
查看 /etc/ssh/sshd_config,确保这三项是打开的:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
如果没有的就加上,修改完之后重启sshd:
systemctl restart sshd
进入局域网服务器,用同样的方式生成rsa密钥。本机也需要生成一份,linux方法一样,windows的话网上资料很多,这里不赘述。
将局域网中id_rsa.pub的内容拷贝出来,进入线上服务器:
su - git #切换至git用户
vim /home/git/.ssh/authorized_keys #创建authorized_keys文件
###将局域网中id_rsa.pub中的内容全部粘贴进去,保存
chmod 600 /home/git/.ssh/authorized_keys #修改权限
此时进入局域网服务器:
su - git #切换至git用户
cd /home/www
#之前没有克隆成功的这里要先 git clone git@{线上ip}:test test
cd test #进入test目录
git pull #此时发现不再需要输入密码
如果之前已经clone了目录而此时还是需要输入密码,就删除test目录重新clone一份。
su - git #切换至git用户
cd /home/www
rm -rf test
git clone git@{线上ip}:test test
git pull
4.本地连接局域网仓库的方式和以上类似,不再赘述
1.创建post-receive
进入局域网服务器,切换至git用户
su - git #切换至git用户
cd /home/git/test.git/hooks #进入hooks目录
vim post-receive #创建post-receive文件
#####填入如下内容
#!/bin/bash
DIR=/home/www/test #指定代码自动检出目录
git --work-tree=${DIR} clean -fd
git --work-tree=${DIR} checkout --force #直接强制检出
注意这里的局域目网录/home/www/test既是web目录,又是线上git库的工作区
修改权限:
chmod +x post-receive #赋予执行权限
2.提交代码会自同步测试运行
从本地push代码,会自动同步至web目录,并且文件拥有者是git。读者请自行配置nginx的进行web访问。
如果html等静态文件可以访问而执行php没有权限(404),需要修改一下php-fpm的运行者和权限为git用户 :
cd /etc/php-fpm.d #这是我的www.conf路径,读者的路径可能有所差异
vim www.conf
# 找到
user = ***
group = ***
# 改为
user = git
group = git
#修改php-fpm运行权限
cd /run/php-fpm #这是我的php-fpm.pid路径,读者的路径可能有所差异
chown git:git php-fpm.pid
3.局域网至线上的钩子用同样的方式配置,这里不再赘述
完成以上三步之后,多个开发人员将代码提交至局域网git库,git自动部署至局域网web,由管理员进入局域网服务器手动提交至线上git库,git自动部署至线上web目录。
但是中间需要人手动操作还是觉得麻烦,于是修改局域网的post-receive,加入推送至线上的流程:
#!/bin/bash
DIR=/home/www/test #指定代码自动检出目录
git --work-tree=${DIR} clean -fd
git --work-tree=${DIR} checkout --force #直接强制检出
###接下来同步至线上
unset GIT_DIR #清除git环境变量
cd ${DIR} #进入代码目录
git add --all #加载所有修改
git commit -a -m 'autocommit on change' #自动提交至版本库
git pull #同步线上代码
git push #推送至线上
至此,整套代码同步是全自动的,开发人员只需要使用git提交代码便会同时部署至局域网和线上,而且提交时还可以看到推送至线上的结果。当然了,如果你线上的服务器也是一个测试版的话你可以这么做,如果是正式版的话还是手动提交吧。