使用git的hooks完成php项目的跨服务器自动发布

环境

LINUX下的gitlab服务器

LINUX下的测试服务器

目的

实现功能:当新的代码被推送至项目git库的指定分支中,测试服务器上的代码,同步更新。

思路

使用gitlab的hooks功能,采用post-receive脚本实现。当新代码被推送时,触发post-receive脚本,登陆到测试服务器,pull新的代码,然后composer升级相关php插件。

步骤

1.完成测试服务器的免密登陆

进入测试服务器root用户(或者指定用户)的.ssh目录,将id_rsa.pub中的内容,复制到gitlab服务器的git用户的authorized_keys中。注意在此文件中,一个用户的key为单独的一行。

使用gitlab服务器的git用户手动完成一次ssh登陆到测试服务器的操作,将服务器秘钥保存至gitlab服务器本地。

2.完成git操作时的免密登陆

在已经克隆完成的项目目录中,编辑./config文件,在尾部加入

[credential]
  helper = store

然后进行一次git pull操作,让登陆凭证自动保存。

3.在测试服务器编写执行脚本

在本项目中,在/opt/shell下建立一个pulldev.sh,加入以下内容,并赋予执行权限

#!/bin/bash
time=$(date "+%Y-%m-%d %H:%M:%S")
echo "${time}" # 以上两行输出执行脚本时的时间
cd /var/www/html/ # 进入项目目录
git pull # 以上两行执行代码的同步
docker exec -it laravel-php /bin/bash -c "cd /var/www/html/ && composer install" # 本行是在php容器内执行“composer install”命令
exit 0 # 退出
# chmod +x pulldev.sh

4.在gitlab服务器编写post-receive脚本

在gitlab服务器中,进入/var/opt/gitlab/git-data/repositories中,找到项目的库目录,如xxx.git。将原有的hooks目录移动走,mv hooks bak_hooks。然后新建hooks目录,并编辑post-receive脚本,键入如下内容:

#!/bin/sh
NowPath=`pwd`
unset GIT_DIR # 非常关键,释放该变量在上次执行后的值
ssh 测试服务器用户名@测试服务器地址 "sh /opt/shell/pulldev.sh >> /opt/shell/pulldev.log;exit"
unset Git_DIR
cd $NowPath
exit 0
# chmod +x post-receive
# chown git.git -R /var/opt/gitlab/git-data/repositories/xxx.git/hooks ##非常关键,因为gitlab服务器对库的操作,都是用系统内的git用户来完成的。这也就是步骤1中为什么将id_rsa.pub添加到git用户的authorized_keys中。

5.测试

5.1在测试服务器,测试脚本:

# sh /opt/shell/pulldev.sh >> /opt/shell/pulldev.log
# cat /opt/shell/pulldev.log

5.2在gitlab服务器,验证post-receive脚本

# su git
$ sh /var/opt/gitlab/git-data/repositories/xxx.git/hooks/post-receive

登陆测试服务器:

# cat /opt/shell/pulldev.log
# cd /var/www/html/
# git log

5.3推送新代码测试

当开发人员向gitlab服务器的dev分支推送新代码后,执行5.2的第二步,观察代码是否更新,如果同步更新,则自动部署完毕。而在这时,开发人员的git客户端也会有相关提示。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注