技术饭

gitee+webhook+php实现自动拉取代码

copylian    0 评论    11015 浏览    2023.02.15

gitee+webhook+php实现自动拉取代码,在项目开发中使用git进行代码的管理,每次完成更改上传代码后,还需要登录服务器将代码拉取下来,现在git服务器(gitee/gitlab/github)都会有Webhooks功能,以实现在向git仓库推送/合并等时机让服务器自动拉取新代码。

参考资料:https://www.bbsmax.com/A/1O5EqRbb57/

参考资料:https://www.pudn.com/news/625136f56caf5961923c0eeb.html

webhook原理:

php_git_webhooks.png


webhook的参数参考:https://gitee.com/help/categories/4

服务器用户设置

webhook正常情况下POST过来的url请求是nginx、apache转发,这里需要查看php-fpm启动的用户,一般是apache、nginx、www,不能使用root(权限太高),所以这需要确定用户,以便用户有权限执行sh,拉取代码,否则用户对应不是会报权限错误

vim  /etc/php-fpm.d/www.conf

微信图片_20230215140829.png

微信图片_20230215141016.png

微信图片_20230215141117.png

确定用户后,打开/etc/passwd文件查看该用户的信息,如下:

apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

改为:

apache:x:48:48:Apache:/usr/share/httpd:/bin/bash

其格式和具体含义如下:

用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell

其中要注意“主目录”这一项,若后续操作提示该目录不存在或错误,打开此文件修改。


接着依次执行下面三条命令,生成ssh的key用于加入gitee:

su - apache // 切换到apache用户

ssh-keygen -t rsa -C "copylian@aikehou.com" // 以邮箱为名创建rsa密钥

cat /usr/share/httpd/.ssh/id_rsa.pub // 查看rsa公钥并复制,.ssh所在目录即上面所提“主目录”


git仓库操作

配置部署公钥

在码云上打开项目仓库,依次点击[管理]=>[部署公钥管理]=>[添加公钥],将上面复制的id_rsa.pub公钥添加进来,完成后在服务器上执行命令:

ssh -T git@gitee.com

首次使用会提示the authenticity of host 'gitee.com...需要输入yes确认并添加主机到本机SSH可信列表,若返回 Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access. 内容,则证明添加成功,添加成功后,当前账户apache就可以使用SSH协议对仓库进行克隆/拉取等操作了。


服务端代码(PHP):

<?php

/**

 * git webhook 自动部署脚本

*/


// 接收post参数

$requestBody = file_get_contents("php://input");

if (empty($requestBody)) {

    exit('data null');

}

$content = json_decode($requestBody, true);

// file_put_contents("./data/1.txt", $requestBody, FILE_APPEND);


// 验证密码,验证码云上配置的webhook密码

if (empty($content['password']) || $content['password'] != 'hook123456') {

    exit('password error');

}


// 项目存放物理路径

$path = "/copylian/www/html/vuejs";

// 判断master分支上是否有提交

if ($content['ref'] == 'refs/heads/master' && $content['total_commits_count'] > 0) {

    $res = shell_exec("cd {$path} && /usr/local/git/bin/git pull origin master 2>&1"); //当前为www用户

    // file_put_contents("./data/1.txt", json_encode($res), FILE_APPEND);

    $res_log = '------------------------->'.PHP_EOL;

    $res_log .= '用户'. $content['user_name'] . ' 于' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '项目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '个commit:' . PHP_EOL;

    $res_log .= $res.PHP_EOL;

    $x = file_put_contents("./data/git_webhook_log.txt", $res_log, FILE_APPEND); //追加写入日志文件

    if ($x) {

        echo 'true-';

    } else {

        echo 'false-';

    }

}

echo 'done';


nginx配置访问的网址:http://xxxx.copylian.com/webhook.php,密码设定:hook123456

微信图片_20230215142453.png

完成配置之后的push操作可在码云[WebHooks 管理]中查看自动部署请求记录信息,也可查看服务器中的git_webhook_log.txt部署日志(php脚本中写入,不需要可注释掉)。

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
gitee webhook php 

文明上网理性发言!

  • 还没有评论,沙发等你来抢