使用 Webhooks 自动部署代码

配置环境

  • 配置PHP,允许exec脚本指令

    • 需求:由于我们使用的是 PHP 开发的 webhook 回调操作,所以这里需要安装 PHP 模块

    • 配置:需要对PHPphp.ini文件进行更改,删除disable_functions下的execshell_exec,这样才能在webhooks.php 文件中,执行脚本命令。如下图:

创建公钥

  • 开启WWW用户

    /etc/passwd文件定位到www那一行把sbin/nologin 改为 bin/bash,如下图:

  • 生成公钥

    因为我们已经开始了 www用户的登录权限,那么在生成公钥之前,需要切换到www 账户下

    • 切换命令:su www

    • 生成公钥命令:ssh-keygen -t rsa -C "1761668306@qq.com"默认回车即可

    • 查看公钥:cat ~/.ssh/id_rsa.pub 其他账户下不可见,只有切换到 www用户才可见,如下图:

    ps:博主在搭建Git服务的时候已经创建了,所以这里不需要生成公钥命令。如没有搭建Git服务请先阅读博主的另一篇博客 Linux系统上搭建Git服务

  • 配置公钥

    • Gitee上配置:设置/SSH公钥然后把cat ~/.ssh/id_rsa.pub指令查看的公钥添加进去,如下图:

    • GitHub上配置:settings/SSH and GPG keys然后把cat ~/.ssh/id_rsa.pub指令查看的公钥添加进去,如下图:

    有了这个公钥的配置,我们通过 webhooks.php 中的脚本指令就可以自动的拉取代码了

  • 测试否连接成功

    • Gitee测试:
    ssh -T git@gitee.com
    

    如出现以下欢迎信息, 说明连接成功, 进一步证明上面的配置正确. 否则, 请仔细检查上面的步骤.

    Hi xxx! You've successfully authenticated, but GITEE.COM does not provide shell access.
    
    • GitHub测试:
    ssh -T git@github.com
    

    如出现以下欢迎信息, 说明连接成功, 进一步证明上面的配置正确. 否则, 请仔细检查上面的步骤.

    Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
    

配置Webhooks

  • 创建webhooks.php(回调脚本)文件

    public目录下新建一个webhooks_emin.php(回调文件),如下图:

    该文件完整代码如下:

    <?php
    /**
    * Git webhooks 自动部署脚本
    * 地址:https://github.com/fuzhengwei/guide-webhooks/settings/hooks
    */
    
    // 接收post参数
    $requestBody = file_get_contents("php://input");
    
    if (empty($requestBody)) {
    	exit('data null!');
    }
    
    // Content type = application/json
    $content = json_decode($requestBody, true);
    
    // 验证 Webhooks 配置的 Secret,也可以不验证
    if (empty($content['password']) || $content['password'] != '123456') {
    	exit('password error');
    }
    
    // 项目存放物理路径
    $path = "/www/wwwroot/new_blogs";
    
    // 判断需要下拉的分支上是否有提交,我们这里的分支名称为 master
    if ($content['ref'] === 'refs/heads/master') {
    
    	// 执行脚本 git pull,拉取分支最新代码
    	$res = shell_exec("cd {$path} && git pull origin master 2>&1"); // 当前为www用户
    
    	// 记录日志 ($content 返回的是一整个对象,可以按需获取里面的内容,写入日志)
    	$res_log = '------------------------->' . PHP_EOL;
    	$res_log .= '用户 ' . $content['pusher']['name'] . ' 于 ' . time() . ' 向项目【' . $content['repository']['name'] . '】分支【' . $content['ref'] . '】PUSH ' . $content['commits'][0]['message'] . PHP_EOL;
    	$res_log .= $res . PHP_EOL;
    	// 需要写入文件的路径地址
    	$newPath = "emin_git_log.txt";
    	// 文件头部BOM必带,否则写入中文内容会乱码
    	$bom = chr(0xEF).chr(0xBB).chr(0xBF) . $res_log;
    	// 内容拼接
    	$str = file_exists($newPath) ? $bom . file_get_contents($newPath) : $bom;
    	// 写入日志文件
    	file_put_contents($newPath, $str);
    }
    echo 'done';
    

这里的回调脚本文件是配置Gitee,如果是要配置GitHub的回调脚本文件要注意其中的分支名称可能是main,那就需要做响应的调整,其他的并无区别;

  • 配置Webhooks

    • Gitee上配置,如下图:

    • GitHub上配置,如下图:

    ps:这里需要注意的就是url为新建的回调脚本文件地址,推荐设置密码

特别注意

  • Gitee的自动请求,如下图:

  • GitHub的自动请求,如下图:

ps:其实GitHub也是配置好了的,但是因为国内网络问题,请求很容易就超时;
其次拉取代码的目录如果没设置好权限,那么开启的www用户是拉取不到代码的
暴力解决方案:chmod 777 目录名
博主建议解决方案:修改该目录的所属者为 www ,指令为:chown -R www 目录名-R的作用是递归作用于目录下的所有文件(包括子目录)

特别感谢

参考博客:Linux 配置gitee

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值