利用GitLab的Webhooks功能,实现网站代码自动更新部署

根据业务需求,已部署GitLab-CE,网站代码上线流程如下图:
利用GitLab的Webhooks功能,实现网站代码自动更新部署_第1张图片
开发者 push 推送代码之后,网站代码仍没更新,还需要操作多一步:登录前端web服务器,手动git pull 拉取更新的代码。这一步是运维的工作,很无趣又烦琐。

幸亏,GitLab提供了Webhooks功能,可以轻松实现网站代码自动更新部署。
利用GitLab的Webhooks功能,实现网站代码自动更新部署_第2张图片
一、webhooks原理
Webhooks的原理

Project webhooks allow you to trigger a URL if for example new code is pushed or a new issue is created.
You can configure webhooks to listen for specific events like pushes, issues or merge requests. GitLab will send a POST request with data to the webhook URL.
Webhooks can be used to update an external issue tracker, trigger CI jobs, update a backup mirror, or even deploy to your production server.

简单说明

webhooks允许指定一个URL,用于触发push或其他事件时进行自定义操作。
例如,当开发者push代码到GitLab服务器,会触发push事件,GitLab会发送一个POST请求连带数据(数据格式)给webhooks指定的URL,该URL可以是前端web的php程序或Python程序等。这样,每当GitLab有push事件,就能在前端web服务器上执行一个脚本程序。

使用webhooks的步骤:

在前端web服务器上安装Git客户端,用于拉取远程仓库 git pull
创建并添加公钥,以便免密码拉取远程仓库
创建脚本程序,并配置webhooks

二、安装Git客户端
在前端web服务器上,执行以下安装命令

yum install git

三、创建并添加公钥
前端web服务器的 nginx 和 php-fpm 都是以 www 用户来运行的,所以要为www用户创建并添加公钥。
www 用户的家目录是: /home/www/
修改 www 用户的 shell 为 /bin/bash
www❌511:511::/home/www:/bin/bash

创建用户的公钥

su www

$ ssh-keygen -t rsa

遇到交互,全部回车就好。
最后会在/home/www/.ssh 目录下生成两个文件,私钥文件:id_rsa,公钥文件:id_rsa.pub
添加公钥到GitLab后台
获取www用户的公钥文件内容:
cat /home/www/.ssh/id_rsa.pub

复制公钥内容,添加公钥,GitLab后台添加公钥的位置:管理员 > Settings > SSH Keys
利用GitLab的Webhooks功能,实现网站代码自动更新部署_第3张图片
修改网站根目录的权限
修改网站根目录( /home/www/test/ ) 的权限,否则以www用户git pull 会报权限问题。

chmod 775 /home/www/test/ -R

chown www.www /home/www/test/ -R

测试
测试www用户基于公钥是否能从Git服务器远程拉取代码
手动执行pull操作

su www

$ cd /home/www/test/  
$ git pull

四、部署webhooks
编写webhooks应用的PHP程序
在前端web服务器的网站根目录(/home/www/test/)下新建一个webhooks.php

&1"); fwrite($fs, 'Info:'. $output.PHP_EOL); fwrite($fs,PHP_EOL. '================ Update End ==============='.PHP_EOL.PHP_EOL); $fs and fclose($fs); ?>

修改PHP配置
因为webhooks用到的php代码中使用了 shell_exec 函数,一般配置php会禁止这个函数,需要打开 shell_exec 函数。
修改前端web服务器上php.ini的 disable_functions 列表,去掉 shell_exec 。
重启php-fpm服务。
配置GitLab
project > Settings > Integrations
利用GitLab的Webhooks功能,实现网站代码自动更新部署_第4张图片
Secret Token中字符串的值,要跟webhooks.php中$access_token 的值相同。
Enable SSL verification 不要勾。
在这里插入图片描述
可以按 [Test] 按钮,测试配置是否生效。
五、遇到的问题
在部署webhooks中,遇到了个很诡异的问题。
前提说明

GitLab-CE 版本:9.2.6
使用xhang项目对GitLab-CE进行汉化过

问题描述:

已成功部署webhooks,按 [Test] 按钮测试正常。
但在实际使用中,开发者push代码后,webhooks.php没有被执行,前端web代码没有git pull 记录,日志也没有记录。GitLab没有检测到开发者的push事件。

问题分析:

通过另外部署一套同版本的、不打汉化补丁的GitLab-CE,发现不是汉化补丁的问题。
回想起之前遇到的一个问题,在GitLab-CE上新创建test项目时,开发者push后,GitLab上仍然显示该项目是空项目,无法检测到push事件,后来还是通过修改项目名来使得其能识别push事件。

问题解决:

后来偶然发现,webhooks时GitLab没有及时检测到开发者的push事件,是因为对 /var/opt/gitlab/ 目录做了软链接的缘故。
去掉软链接,改为正常的目录路径。

作者:hjqjk
链接:https://www.jianshu.com/p/80d9a656d6c6
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

你可能感兴趣的:(前端,nginx)