登录
原创

Git WebHook 使用 PHP 脚本实现自动化部署

发布于 2020-10-16 阅读 45
  • 开源
  • PHP
  • 自动化运维
原创

今天就说说如何通过 webhook 的形式来让服务器自动拉取我们 push 的代码,当然 JenkinsGitlab CI/CD 更适合做这种工作,但简单的项目就简单操作了。

一、原理

现在的 Git 服务器一般都会有个 webhook 服务,什么意思呢?就是我们在执行了 pushmerge 等一系列的操作的时候

Git 服务器会发送一个请求到我们指定的 URL,并且会把此次动作的相关数据也发送过去

1.1 开源中国 Gitee 演示

这里我们使用开源中国的码云演示:在帮助文档中可以看到,当我们发生 push 之类的操作的时候

》Git 服务器会像我们指定的 url 发送以下数据:

{
    "before": "fb32ef5812dc132ece716a05c50c7531c6dc1b4d", 
    "after": "ac63b9ba95191a1bf79d60bc262851a66c12cda1", 
    "ref": "refs/heads/master", 
    "user_id": 13,
    "user_name": "123", 
    "user": {
      "name": "123",
      "username": "test123",
      "url": "https://gitee.com/oschina"
    }, 
    "repository": {
        "name": "webhook", 
        "url": "http://git.oschina.net/oschina/webhook", 
        "description": "", 
        "homepage": "https://gitee.com/oschina/webhook"
    }, 
    "commits": [
        {
            "id": "ac63b9ba95191a1bf79d60bc262851a66c12cda1", 
            "message": "1234 bug fix", 
            "timestamp": "2016-12-09T17:28:02 08:00", 
            "url": "https://gitee.com/oschina/webhook/commit/ac63b9ba95191a1bf79d60bc262851a66c12cda1", 
            "author": {
                "name": "123", 
                "email": "123@123.com", 
                "time": "2016-12-09T17:28:02 08:00"
            }
        }
    ], 
    "total_commits_count": 1, 
    "commits_more_than_ten": false, 
    "project": {
        "name": "webhook", 
        "path": "webhook", 
        "url": "https://gitee.com/oschina/webhook", 
        "git_ssh_url": "git@gitee.com:oschina/webhook.git", 
        "git_http_url": "https://gitee.com/oschina/webhook.git", 
        "git_svn_url": "svn://gitee.com/oschina/webhook", 
        "namespace": "oschina", 
        "name_with_namespace": "oschina/webhook", 
        "path_with_namespace": "oschina/webhook", 
        "default_branch": "master"
    }, 
    "hook_name": "push_hooks", 
    "password": "pwd"
}

根据上面信息,我们就可以拿这些数据来简单整合操作了

二、准备

  • 一个 git 仓库
  • 安装了 web 服务器与 Git 支持的服务器

三、正式开始:

3.1 首先我们需要为 www 用户创建一个 ssh 密钥

切换到 www 用户下并生成一个 rsa 密钥

su - www
ssh-keygen -t rsa

密钥一般生成在 /home/www/.ssh/ 这个路径下

文件名为 id_rsa

创建一个可供 Git 服务器通知的页面,网站的建立这里不再敷述,文件内容如下:

<?php

// Git WebHooks 自动部署脚本
// 项目存放物理路径
$path = "你的项目部署路径";
$requestBody = file_get_contents("php://input");
if (empty($requestBody)) {
    die('send fail');
}
$content = json_decode($requestBody, true);
// 若是主分支且提交数大于 0 请修改为 refs/heads/master
if ($content['ref'] == 'refs/heads/develop' && $content['total_commits_count'] > 0) {
    $res = shell_exec("cd {$path} && git pull 2>&1");// 以 www 用户运行
    $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;
    var_dump($res_log);
    file_put_contents("git-webhook.txt", $res_log, FILE_APPEND);//追加写入
}
echo '更新完成: '.date('y-m-d H:i:s');

以上代码相信都可以看懂的,Git 发送过来的数据相当丰富,我们可以用这些数据来做些过滤来决定是否需要更新服务器上的本地代码

3.2 代码仓库设置

  1. 创建代码仓库,创建方法这里不在敷述
  2. 添加 ssh 密钥

在项目管理中把上面步骤第一步中得到的 ssh 密钥添加到仓库的部署密钥中,这样我们的 web 服务器就有了拉取代码的权限

  1. 添加 hook 路径

同样在项目管理中添加 webhook 链接,这里可以添加一个密码,我偷懒这里没加,需要加的话可以在 hook 文件中添加一个验证,可以防止被恶意访问

3.3 克隆初始化操作

最后我们需要在我们的部署目录先把 git 初始化一次

su - www
git clone git仓库地址 项目部署地址

然后我们往 git 仓库中提交一次代码更新,稍等一会如果一切顺利的话,我们的项目目录就会自动拉取你刚才提交的代码了。
在 hook 路径中也有 log 记录,不需要的话可以把代码注释掉

注意: 拉取代码的用户名,必须有项目目录写的权限,不然无法更新最新代码的。

评论区

lisgroup
8粉丝

励志做一条安静的咸鱼,从此走上人生巅峰。

1

0

0