Search by

zzktz / laravel-githook

zzktz

支持 Gitee 和 GitHub Webhook 的 Laravel 安全更新扩展包

Package info

github.com/zzktz/laravel-githook

pkg:composer/zzktz/laravel-githook

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

dev-main 2026-10-27 14:19 UTC

This package is auto-updated.

Last update: 2026-10-27 14:19:58 UTC


README

通过 Gitee 或 GitHub Webhook 安全触发 Laravel 项目的 Git 更新,支持 Laravel 8 及以上版本。

安装

当前 Packagist 收录版本为 dev-main,使用以下命令安装:

composer require zzktz/laravel-githook:dev-main
php artisan vendor:publish --tag=githook-config

发布稳定版本后,可将 dev-main 替换为对应的稳定版本号。

Service Provider 支持 Laravel Composer 自动发现。若项目关闭了自动发现,请在 config/app.php 的 providers 中注册 Zzktz\LaravelGithook\GithookServiceProvider::class。

配置

在 .env 中设置:

GITHOOK_ENABLED=true
GITHOOK_SECRET=请替换为随机长密钥
GITHOOK_GITHUB_ENABLED=true
GITHOOK_GITHUB_SECRET=请替换为另一随机长密钥
GITHOOK_ROUTE_PREFIX=githook
GITHOOK_ROUTE_URI=webhook
GITHOOK_GITHUB_ROUTE_URI=github
GITHOOK_LOG_CHANNEL=stack

GITHOOK_ENABLED 是总开关,GitHub 入口还需要启用 GITHOOK_GITHUB_ENABLED。Gitee 使用 GITHOOK_SECRET(兼容旧配置)或 GITHOOK_GITEE_SECRET;GitHub 使用单独的 GITHOOK_GITHUB_SECRET。

在 config/githook.php 配置仓库。path 必须是服务器上已存在的 Git checkout 绝对路径;包只接受配置的仓库和分支。示例:

'repositories' => [
    'production' => [
        'gitee_repository' => 'your-team/your-project',
        'github_repository' => 'your-org/your-project',
        'remote' => 'git@github.com:your-org/your-project.git',
        'path' => base_path(),
        'branches' => ['main'],
        'secrets' => [
            'gitee' => env('GITHOOK_PRODUCTION_GITEE_SECRET'),
            'github' => env('GITHOOK_PRODUCTION_GITHUB_SECRET'),
        ],
    ],
],

仓库名按 provider 分别匹配:Gitee 使用 gitee_repository,GitHub 使用 github_repository;省略时使用通用 repository 字段或配置键。仓库级 secrets.gitee / secrets.github 优先于各自的全局密钥。旧版的仓库 secret 仍作为 Gitee 专属密钥。

Gitee Webhook 使用 X-Gitee-Token 和 X-Gitee-Event 校验。GitHub Webhook 使用 X-GitHub-Event: push,并以配置的 Secret 校验原始请求体的 X-Hub-Signature-256 HMAC-SHA256 签名。

默认要求工作树干净,只执行 fetch 和快进更新;本地有未提交文件或分支发生分叉时会拒绝部署,不会执行强制重置。请确保 PHP-FPM/应用用户有目录写权限,并能通过 Git remote 配置的 SSH key 或 HTTPS 凭据访问仓库。Web 服务器应使用 HTTPS。

默认 Gitee API 地址为 POST /githook/webhook,GitHub 地址为 POST /githook/github。分别在 Gitee 选择 Push Hook,在 GitHub Webhooks 中选择 Just the push event,Content type 选择 application/json,并填写 GitHub Secret。可通过 GITHOOK_ROUTE_PREFIX、GITHOOK_ROUTE_URI、GITHOOK_GITHUB_ROUTE_URI 和 githook.route.middleware 修改路径及中间件。默认限制 JSON 请求体为 1 MiB;来源 IP 白名单分别配置在 providers.gitee.allowed_ips 和 providers.github.allowed_ips。

部署行为

部署前会检查服务开关、JSON、事件类型、来源 IP(若启用)、仓库身份、共享密钥、分支白名单、工作目录、Git worktree、remote 和工作树状态。相同目录的并发请求通过文件锁串行保护;Git 操作和每条部署命令默认超时 120 秒,可通过 deployment.timeout 调整。命令达到超时后会被终止并作为部署失败返回,避免网络等待无限期挂起。

首版在 webhook HTTP 请求中同步部署。若更新步骤可能超过 webhook 提供方的请求等待时限,应缩短命令耗时或在后续集成队列异步处理;超时后的 webhook 重试可能再次触发部署,因此部署命令应保持幂等。

代码更新后默认执行 composer install --no-interaction --prefer-dist,根据仓库中的 composer.lock 同步 A 项目的依赖,因此通常无需登录服务器手动安装依赖。开发时修改依赖后,应在开发环境更新并提交 composer.lock,否则部署无法保证安装到预期版本。还需确保运行 Laravel 的用户能执行 Composer、写入 vendor 目录。若不需要默认安装或要调整命令,可在 deployment.commands 中覆盖配置。命令必须写成参数数组,不能来自 webhook payload,例如:

'deployment' => [
    'commands' => [
        ['composer', 'install', '--no-dev', '--prefer-dist', '--no-interaction'],
        ['php', 'artisan', 'config:cache'],
    ],
    'health_check' => [
        'url' => 'https://example.com/health',
        'timeout' => 5,
    ],
],

健康检查 URL 和部署命令只应由项目管理员配置。数据库迁移默认不执行;确认项目迁移流程可安全自动化后,才应将其作为受控的部署命令配置。

部署命令成功或失败都会写入 Laravel 配置的日志 channel(默认 stack,通常记录在 storage/logs/laravel.log)。失败日志包含退出码、超时状态和截断后的命令错误输出;日志会对常见 URL 凭据和令牌格式进行脱敏。Webhook 响应只返回状态、稳定错误码、request ID 和必要的 commit 信息,不会返回命令输出。

本地开发

composer install
composer test