网站首页 » Git » gitee webhook通知自动更新生产环境项目

gitee webhook通知自动更新生产环境项目

January 18, 2022 Git

为什么要通过webhook更新项目?
在项目开发完成上线后,后续还要对项目进行持续开发,bug修复,功能更新。每次更新项目,我们必须要首先提交到git,再登陆服务器,这么操作就很麻烦。有没有办法,当我们发布了新版本后,就自动将生产环境中的项目更新成最新的版本。将会简化我的工作内容,减少工作量。

webhook 就是当我们的仓库发生变化后,将通过url post 方式通知我们设置好的地址。请求时将携带变化的内容,这时我们只需要设置一个接收地址,通过判断请求时携带的数据,就可以得知是否新版本,如果是新版本我们就通过代码,在生产项目根目录执行 git pull, 将代码更新成最新版本。

  1. 在Gitee上设置webhook

说明:https://gitee.com/help/articles/4184#article-header0

webhook验证的方式有两种:一种是密码,另一种是签名密钥

密码方式,密码在传输过程中是明文,不太安全。
签名密钥方式,我们在gitee上设置自己的密钥,gitee将数据通过密钥加密,然后在网络上传输;我们得到传输的数据,通过相同的是方式进行加密,对比密钥后可认定是否可信。密钥不在网络上传输,所以安全性高。(推荐使用这种方式)

  1. 在服务器上处理请求

2.1 验证推送
加密方式:
Step1:把timestamp+"n"+密钥当做签名字符串,使用HmacSHA256算法计算签名。
Setp2:对上述得到的结果进行 Base64 encode。
Setp3:对上述得到的结果进行 urlEncode,得到最终的签名(需要使用UTF-8字符集)

php 代码

// 获取请求信息
$user_agent = $_SERVER["User-Agent"];
$gitee_token = $_SERVER["X-Gitee-Token"];
$gitee_timestamp = $_SERVER["X-Gitee-Timestamp"];
// webhook 签名密钥
$secret = "cx123";

// 加密
$sign_string = $gitee_timestamp . "n" . $secret;
$sign = base64_encode(hash_hmac("sha256", $sign_string, $secret, true));

if ($sing != $gitee_token) {

echo "验签失败\n 获取签名:$gitee_token \n 计算签名:$sign";
exit;

}

2.2 执行更新

php 代码

使用 Proc_open 方法执行shell 命令。 首先要编辑Php.ini 文件,将 proc_open 方法从php.ini 中 disabled_function 参数中去掉,才能使用这个方法

// 使用Proc_open 执行 Shell 命令
$command= " ls -al ";
$descriptorspec=array(

0=>array('pipe','r'), 
1=>array('pipe','w'),
2=>array('pipe','w') 

);
$handle=proc_open($command,$descriptorspec,$pipes);
if(!is_resource($handle)){

exit("failed");

}
while($s=fgets($pipes[1])){

print_r($s);

}
while($s=fgets($pipes[2])){

print_r($s);

}
fclose($pipes[0]);
fclose($pipes[1]);
fclose($pipes[2]);
proc_close($handle);

添加新评论