gitwebhooks 2.4.0__tar.gz → 2.4.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- gitwebhooks-2.4.2/AGENTS.md +291 -0
- gitwebhooks-2.4.2/CHANGELOG.md +285 -0
- gitwebhooks-2.4.2/CONSTITUTION.md +330 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/MANIFEST.in +3 -1
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/PKG-INFO +37 -27
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/README.md +35 -24
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/README.zh.md +35 -24
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/__init__.py +1 -1
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/auth/custom.py +6 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/auth/factory.py +0 -25
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/auth/gitee.py +6 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/auth/gitlab.py +6 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/cli/__init__.py +31 -7
- gitwebhooks-2.4.2/gitwebhooks/cli/help.py +86 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/cli/init_wizard.py +13 -7
- gitwebhooks-2.4.2/gitwebhooks/cli/prompts.py +126 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/cli/serve.py +4 -39
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/cli/service.py +13 -17
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/config/loader.py +28 -10
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/config/models.py +0 -1
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/config/registry.py +0 -38
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/config/server.py +1 -1
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/base.py +0 -10
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/custom.py +4 -7
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/factory.py +0 -37
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/gitee.py +4 -8
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/github.py +2 -6
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/gitlab.py +2 -6
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/request.py +1 -1
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/main/__init__.py +30 -17
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/main/version.py +0 -2
- gitwebhooks-2.4.2/gitwebhooks/models/request.py +31 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/server.py +0 -2
- gitwebhooks-2.4.2/gitwebhooks/utils/executor.py +109 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/utils/systemd.py +2 -46
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks.egg-info/PKG-INFO +37 -27
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks.egg-info/SOURCES.txt +5 -7
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks.ini.sample +2 -2
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/pyproject.toml +2 -3
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/conftest.py +29 -108
- gitwebhooks-2.4.2/tests/fixtures/custom_payloads.py +67 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/fixtures/gitee_payloads.py +0 -93
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/fixtures/github_payloads.py +0 -104
- gitwebhooks-2.4.2/tests/fixtures/gitlab_payloads.py +112 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/fixtures/signature_builder.py +0 -10
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_command_execution.py +71 -37
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_config_discovery.py +5 -3
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_edge_cases.py +19 -10
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_gitee_webhook.py +0 -3
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_github_webhook.py +7 -9
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/cli/test_config_view.py +0 -3
- gitwebhooks-2.4.2/tests/unit/cli/test_help.py +121 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/cli/test_init_wizard.py +1 -6
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_config_loading.py +2 -2
- gitwebhooks-2.4.2/tests/unit/test_executor.py +139 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_install_service_logic.py +1 -66
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_main.py +9 -12
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_prompts_config_level.py +10 -6
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_signature_verification.py +37 -1
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/utils/http_client.py +1 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/utils/server_manager.py +14 -155
- gitwebhooks-2.4.0/CLAUDE.md +0 -313
- gitwebhooks-2.4.0/gitwebhooks/cli/help.py +0 -155
- gitwebhooks-2.4.0/gitwebhooks/cli/prompts.py +0 -322
- gitwebhooks-2.4.0/gitwebhooks/models/request.py +0 -61
- gitwebhooks-2.4.0/gitwebhooks/utils/executor.py +0 -34
- gitwebhooks-2.4.0/tests/fixtures/custom_payloads.py +0 -249
- gitwebhooks-2.4.0/tests/fixtures/gitlab_payloads.py +0 -243
- gitwebhooks-2.4.0/tests/test_auth/__init__.py +0 -2
- gitwebhooks-2.4.0/tests/test_config/__init__.py +0 -2
- gitwebhooks-2.4.0/tests/test_handlers/__init__.py +0 -2
- gitwebhooks-2.4.0/tests/test_integration/__init__.py +0 -2
- gitwebhooks-2.4.0/tests/utils/certificate_generator.py +0 -236
- gitwebhooks-2.4.0/tests/utils/coverage_runner.py +0 -329
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/.editorconfig +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/LICENSE +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/custom-body.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/custom-header.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/custom-response.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/gitee-success.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/gitee.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/github-success.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/github.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/gitlab-success.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/gitlab.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/install.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/doc/uninstall.png +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/__main__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/auth/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/auth/github.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/auth/verifier.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/cli/config.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/config/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/handlers/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/logging/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/logging/setup.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/main/__main__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/models/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/models/config.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/models/provider.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/models/result.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/utils/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/utils/constants.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks/utils/exceptions.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks.egg-info/dependency_links.txt +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks.egg-info/entry_points.txt +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks.egg-info/requires.txt +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/gitwebhooks.egg-info/top_level.txt +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/setup.cfg +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/__main__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/fixtures/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_config_view_integration.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_custom_webhook.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/integration/test_gitlab_webhook.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/cli/__init__.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_config_level.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_data_parsing.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_provider_detection.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_request_handler.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/unit/test_service_install_context.py +0 -0
- {gitwebhooks-2.4.0 → gitwebhooks-2.4.2}/tests/utils/__init__.py +0 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# AGENTS.md — gitwebhooks
|
|
2
|
+
|
|
3
|
+
> 轻量级 Git Webhook 服务器:接收 GitHub / Gitee / GitLab / 自定义平台的 webhook,按 INI 配置执行仓库部署命令。纯 Python 3 标准库实现,无外部运行时依赖。
|
|
4
|
+
>
|
|
5
|
+
> **⚠️ 最高编码准则见 [`CONSTITUTION.md`](./CONSTITUTION.md)(项目编码宪章)——所有 MUST 条款、合规分级与审查口径以宪章为准,冲突时宪章优先**。本文档为入口摘录,不重复宪章长文。
|
|
6
|
+
|
|
7
|
+
## 项目概述
|
|
8
|
+
|
|
9
|
+
| 项 | 值 |
|
|
10
|
+
|----|----|
|
|
11
|
+
| 语言 | Python(`requires-python = ">=3.7"`,classifiers 覆盖 3.7–3.14) |
|
|
12
|
+
| 运行时依赖 | **无**(仅标准库;`pyproject.toml` 的 `dependencies = []` 是硬约定) |
|
|
13
|
+
| 开发依赖 | `pytest`、`pytest-cov`(dev extra;**全量测试套件的运行器**) |
|
|
14
|
+
| 代码规模 | 4.6k 行(`gitwebhooks/`,4570 行) |
|
|
15
|
+
| 配置格式 | INI(`configparser`) |
|
|
16
|
+
| HTTP | 标准库 `http.server` |
|
|
17
|
+
| 打包 | `setuptools`,可发布 PyPI,亦支持原地从源码运行 |
|
|
18
|
+
| 当前版本 | `2.4.2`(`pyproject.toml` 与 `gitwebhooks/__init__.py` **两处**) |
|
|
19
|
+
|
|
20
|
+
**支持平台**:GitHub(HMAC-SHA1 签名)、Gitee(签名或密码)、GitLab(token)、custom(自定义 Header + JSON 路径识别)。
|
|
21
|
+
|
|
22
|
+
## 宪章与文档层级
|
|
23
|
+
|
|
24
|
+
**最高编码准则:[`CONSTITUTION.md`](./CONSTITUTION.md)** —— 所有贡献者与 AI 代理必须遵守其 MUST 条款;本文档与 `README*.md`、`.dsh/skills/` 不得弱化宪章要求,**冲突时以宪章为准**。
|
|
25
|
+
|
|
26
|
+
| 优先级 | 文件 | 职责 |
|
|
27
|
+
|--------|------|------|
|
|
28
|
+
| 1 | `CONSTITUTION.md` | 编码宪章(MUST 条款、架构不变量、合规分级 A/B/C、审查矩阵) |
|
|
29
|
+
| 2 | `AGENTS.md`(本文档) | Agent 入口:架构、命令、约束摘录 |
|
|
30
|
+
| 3 | `README.md` / `README.zh.md` | 用户手册(安装、配置、使用;两语言须同步) |
|
|
31
|
+
| 4 | `.dsh/skills/*` | 操作技能(`code-review` 代码审查口径) |
|
|
32
|
+
|
|
33
|
+
## 架构
|
|
34
|
+
|
|
35
|
+
依赖方向单向(上层依赖下层):
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
main/ cli/ 入口:参数解析、子命令分发、交互式向导
|
|
39
|
+
↓
|
|
40
|
+
server.py HTTP 服务器、请求生命周期编排
|
|
41
|
+
↓
|
|
42
|
+
handlers/ 平台事件识别 → 仓库分发 → 调用部署命令
|
|
43
|
+
auth/ 各平台签名 / token 校验(工厂 + 每平台一文件)
|
|
44
|
+
↓
|
|
45
|
+
config/ INI 加载、注册表、配置数据模型
|
|
46
|
+
models/ 与框架无关的数据类与枚举(Provider / WebhookRequest / 验证结果)
|
|
47
|
+
utils/ 常量、异常、命令执行、systemd 辅助
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**请求处理流程**:`do_POST()` → `_parse_provider()`(按 Header 识别平台)→ `_parse_data()`(JSON / form-urlencoded)→ 平台处理器验证签名 / token → 提取仓库标识 → 查配置 → 异步执行配置的命令。
|
|
51
|
+
|
|
52
|
+
**平台差异**(识别 Header / 仓库标识 / 验证方式):
|
|
53
|
+
|
|
54
|
+
| 平台 | 事件 Header | 仓库标识 | 验证 |
|
|
55
|
+
|------|-------------|----------|------|
|
|
56
|
+
| GitHub | `X-GitHub-Event` | `repository.full_name` | `X-Hub-Signature`(HMAC-SHA1) |
|
|
57
|
+
| Gitee | `X-Gitee-Event` | `repository.full_name` | 签名或密码 |
|
|
58
|
+
| GitLab | `X-Gitlab-Event` | `project.path_with_namespace` | `X-Gitlab-Token` |
|
|
59
|
+
| custom | 配置的 `header_event` | 配置的 `identifier_path` | 配置的 `header_token` |
|
|
60
|
+
|
|
61
|
+
## 文件结构
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
gitwebhooks-cli # Bash 包装脚本:自动定位包并以 python3 -m gitwebhooks.main 运行
|
|
65
|
+
pyproject.toml # 打包、版本号(源 1)、入口点 gitwebhooks.main:main
|
|
66
|
+
MANIFEST.in # sdist 清单
|
|
67
|
+
CHANGELOG.md # 更新日志(Keep a Changelog;发布时必须更新)
|
|
68
|
+
gitwebhooks.ini.sample # 配置模板(改配置项须同步)
|
|
69
|
+
scripts/pre-release-check.sh # 发布前校验(构建 + 隔离环境安装 + CLI 冒烟)
|
|
70
|
+
gitwebhooks/
|
|
71
|
+
├── __init__.py # 包入口、__version__(源 2)、导出 WebhookServer / Provider / WebhookRequest
|
|
72
|
+
├── server.py # WebhookServer 与请求处理器:编排与派发
|
|
73
|
+
├── main/
|
|
74
|
+
│ ├── __init__.py # create_parser / find_config_file / main(CLI 主函数)
|
|
75
|
+
│ ├── __main__.py # python3 -m gitwebhooks.main 入口
|
|
76
|
+
│ └── version.py # 版本输出
|
|
77
|
+
├── cli/
|
|
78
|
+
│ ├── __init__.py # 子命令注册(serve / config / help)
|
|
79
|
+
│ ├── serve.py # cmd_serve:启动服务器 / systemd 安装卸载分发
|
|
80
|
+
│ ├── service.py # systemd 安装卸载实现(被 serve.py 调用,非子命令)
|
|
81
|
+
│ ├── config.py # cmd_init / cmd_view
|
|
82
|
+
│ ├── init_wizard.py # 交互式配置向导(⚠️ 785 行,见宪章 §1.2)
|
|
83
|
+
│ ├── prompts.py # 交互提示辅助
|
|
84
|
+
│ └── help.py # help 子命令(输出由 argparse format_help 生成,与 --help 同源)
|
|
85
|
+
├── config/
|
|
86
|
+
│ ├── loader.py # INI 加载与自动查找
|
|
87
|
+
│ ├── registry.py # 配置注册表
|
|
88
|
+
│ ├── models.py # 配置数据类
|
|
89
|
+
│ └── server.py # 服务器 / SSL 配置
|
|
90
|
+
├── auth/
|
|
91
|
+
│ ├── verifier.py # 验证器基类
|
|
92
|
+
│ ├── factory.py # 验证器工厂
|
|
93
|
+
│ └── github.py gitee.py gitlab.py custom.py
|
|
94
|
+
├── handlers/
|
|
95
|
+
│ ├── base.py # 处理器基类
|
|
96
|
+
│ ├── request.py # 请求数据解析
|
|
97
|
+
│ ├── factory.py # 处理器工厂
|
|
98
|
+
│ └── github.py gitee.py gitlab.py custom.py
|
|
99
|
+
├── models/
|
|
100
|
+
│ ├── provider.py # Provider 枚举(Github / Gitee / Gitlab / Custom)
|
|
101
|
+
│ ├── request.py # WebhookRequest 数据类
|
|
102
|
+
│ ├── result.py # 验证结果
|
|
103
|
+
│ └── config.py # 配置模型
|
|
104
|
+
├── utils/
|
|
105
|
+
│ ├── constants.py # HTTP 常量、Header 名、路径、RESERVED_SECTIONS、SENSITIVE_KEYWORDS
|
|
106
|
+
│ ├── exceptions.py # 自定义异常(含 ConfigurationError)
|
|
107
|
+
│ ├── executor.py # execute_deployment(异步 subprocess;守护线程排空输出 + wait 回收)
|
|
108
|
+
│ └── systemd.py # systemd 检测与服务文件生成
|
|
109
|
+
└── logging/setup.py # 日志配置
|
|
110
|
+
tests/
|
|
111
|
+
├── __main__.py # 项目自带 runner:python3 -m tests
|
|
112
|
+
├── conftest.py # 共享夹具(临时目录、空闲端口、服务器管理等)
|
|
113
|
+
├── unit/ # 单元测试(unit/cli/ 为 CLI 子命令测试)
|
|
114
|
+
├── integration/ # 端到端 webhook / 配置发现 / 命令执行
|
|
115
|
+
├── fixtures/ # 各平台 payload 与签名构造器
|
|
116
|
+
└── utils/ # 测试辅助(HTTP 客户端、线程内测试服务器)
|
|
117
|
+
doc/ # README 截图(二进制资源)
|
|
118
|
+
.dsh/skills/ # DSH 项目技能(项目唯一技能来源)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 配置结构
|
|
122
|
+
|
|
123
|
+
INI 格式(`configparser`),保留节名以 `utils/constants.py` 的 `RESERVED_SECTIONS` 为准:
|
|
124
|
+
|
|
125
|
+
| 节 | 内容 |
|
|
126
|
+
|----|------|
|
|
127
|
+
| `[server]` | `address`、`port`、`log_file` |
|
|
128
|
+
| `[ssl]` | `enable`、`key_file`、`cert_file` |
|
|
129
|
+
| `[github]` / `[gitee]` / `[gitlab]` | `handle_events`、`verify`、`secret` |
|
|
130
|
+
| `[custom]` | `header_name`、`header_value`、`header_token`、`header_event`、`identifier_path`、`handle_events`、`verify`、`secret` |
|
|
131
|
+
| `[owner/repo]` | **仓库节**:`cwd`(工作目录)、`cmd`(收到 webhook 时执行的 shell 命令) |
|
|
132
|
+
|
|
133
|
+
- 仓库节名必须为 `owner/repo`;`identifier_path` 是 JSON 路径(如 `project.path_with_namespace`),用点号分隔。
|
|
134
|
+
- 改配置项**必须**同步 `gitwebhooks.ini.sample`、`RESERVED_SECTIONS` 与两个 README。
|
|
135
|
+
|
|
136
|
+
**默认部署路径**:配置 `/usr/local/etc/gitwebhooks.ini`、日志 `/var/log/gitwebhooks.log`、CLI `/usr/local/bin/gitwebhooks-cli`、systemd 单元 `/usr/lib/systemd/system/gitwebhooks.service`。
|
|
137
|
+
|
|
138
|
+
## 常用命令
|
|
139
|
+
|
|
140
|
+
### 运行服务
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# 从源码运行(开发模式,推荐)
|
|
144
|
+
./gitwebhooks-cli serve -c gitwebhooks.ini.sample
|
|
145
|
+
|
|
146
|
+
# 模块方式(等价)
|
|
147
|
+
python3 -m gitwebhooks.main serve -c gitwebhooks.ini.sample
|
|
148
|
+
|
|
149
|
+
# 不指定 -c:按优先级自动查找配置并打印所用路径
|
|
150
|
+
./gitwebhooks-cli serve
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
> ⚠️ 启动服务器**必须**带 `serve` 子命令。`./gitwebhooks-cli -c file.ini`(无子命令)只会打印帮助并返回 0,不会启动服务。
|
|
154
|
+
|
|
155
|
+
**配置文件查找优先级**(唯一出处 `utils/constants.py` 的 `CONFIG_SEARCH_PATHS`):
|
|
156
|
+
|
|
157
|
+
1. `~/.gitwebhooks.ini`(用户级,最高)
|
|
158
|
+
2. `/usr/local/etc/gitwebhooks.ini`(本地级)
|
|
159
|
+
3. `/etc/gitwebhooks.ini`(系统级)
|
|
160
|
+
|
|
161
|
+
### 子命令
|
|
162
|
+
|
|
163
|
+
```bash
|
|
164
|
+
./gitwebhooks-cli --help # 总览帮助(亦可 -h;每层级均支持)
|
|
165
|
+
./gitwebhooks-cli help # 等价形式:help 子命令
|
|
166
|
+
./gitwebhooks-cli help serve # 指定子命令帮助(serve / config)
|
|
167
|
+
./gitwebhooks-cli serve --help # 同上,标准 flag 形式(两者输出完全一致)
|
|
168
|
+
./gitwebhooks-cli --version # 版本(亦可 -v)
|
|
169
|
+
|
|
170
|
+
# 配置:交互式向导(可指定级别 system/local/user)
|
|
171
|
+
./gitwebhooks-cli config init
|
|
172
|
+
sudo ./gitwebhooks-cli config init system
|
|
173
|
+
./gitwebhooks-cli config view # 查看配置,敏感字段高亮
|
|
174
|
+
./gitwebhooks-cli config view -c /path/to/config.ini
|
|
175
|
+
|
|
176
|
+
# systemd 服务(注意:是 serve 的子动作,不是独立的 service 子命令)
|
|
177
|
+
sudo ./gitwebhooks-cli serve install [--force] [--dry-run] [--verbose] [--config-level user|local|system]
|
|
178
|
+
./gitwebhooks-cli serve install --config-level user
|
|
179
|
+
sudo ./gitwebhooks-cli serve uninstall [--purge]
|
|
180
|
+
|
|
181
|
+
# systemd 运行时
|
|
182
|
+
systemctl {start,stop,restart,status} gitwebhooks
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
> ⚠️ 独立的 `service` 子命令**已被移除**(见 git log `refactor: 彻底移除 service 命令`),改为 `serve install` / `serve uninstall`。文档或脚本中出现 `gitwebhooks-cli service ...` 即为过时引用。
|
|
186
|
+
|
|
187
|
+
### 安装与发布
|
|
188
|
+
|
|
189
|
+
```bash
|
|
190
|
+
pip install . # 安装(无外部依赖)
|
|
191
|
+
pip install -e ".[dev]" # 开发安装(含 pytest)
|
|
192
|
+
|
|
193
|
+
./scripts/pre-release-check.sh # 发布前必须通过:构建 + 隔离 venv 安装 + CLI 冒烟
|
|
194
|
+
python3 -m build && python3 -m twine upload dist/*
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## 测试与质量门禁
|
|
198
|
+
|
|
199
|
+
**全量测试(权威,必须用这个)** — 先装 dev extra:
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
pip install -e ".[dev]" # 含 pytest
|
|
203
|
+
python3 -m pytest tests/ # 228 个测试全跑,约 10 秒
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
**零依赖子集 runner**(`unittest`,**不是**全量):
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
python3 -m tests # 只跑到不依赖 pytest 的模块(当前 128 个)
|
|
210
|
+
python3 -m tests -q # 仅摘要
|
|
211
|
+
python3 -m tests -f # 失败即停
|
|
212
|
+
python3 -m tests -v # 详细
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
> ⚠️ `python3 -m tests` 跑不到 `tests/unit/test_main.py` 等 7 个 pytest 风格模块
|
|
216
|
+
> (当前约 100 个测试),因此**不能**用它声称「测试全通过」。
|
|
217
|
+
|
|
218
|
+
**语法静态校验**:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
python3 -m compileall -q gitwebhooks
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### 门禁纪律
|
|
225
|
+
|
|
226
|
+
- 交付前跑 `python3 -m compileall -q gitwebhooks` + **全量** `python3 -m pytest tests/`;
|
|
227
|
+
- **如实区分**「本机真跑过 / 只做了静态检查 / 未执行」;声称通过时给出**实际计数**(跑了多少 / 失败 / 跳过);
|
|
228
|
+
- **禁止吞输出**(`>/dev/null`、`2>/dev/null`、`-q` 用于可能失败的命令);
|
|
229
|
+
- CLI 子命令增删时,**必须**核对全部引用点:`cli/__init__.py` 注册、`cli/help.py`、`README.md`、`README.zh.md`、`scripts/pre-release-check.sh`、相关测试。
|
|
230
|
+
|
|
231
|
+
### 测试基线
|
|
232
|
+
|
|
233
|
+
**`python3 -m pytest tests/`(Python 3.14)**:`228 passed`,约 10 秒,**0 挂起**。
|
|
234
|
+
|
|
235
|
+
**`python3 -m tests`(无 pytest)**:`Ran 128 tests`,5 个 error(pytest 风格模块无法导入)。这些 error 是**子集 runner 的已知限制**,不是代码缺陷。
|
|
236
|
+
|
|
237
|
+
判定改动是否引入回归时,必须以**全量 pytest 结果**为准。
|
|
238
|
+
|
|
239
|
+
## 代码审查
|
|
240
|
+
|
|
241
|
+
代码 / 文档改动交付前,加载 **`.dsh/skills/code-review/SKILL.md`** 执行审查:按宪章输出 `P0–P3 × file:line × 依据条款 × 证据` 的结构化发现清单。
|
|
242
|
+
|
|
243
|
+
- 审查**只报不改**;发现自己问题的「顺手修一下」不属于审查结论。
|
|
244
|
+
- 涉及**必须运行才能确认**的项(如某失败是否被修复、某分支是否真的到达),标注「需主代理跑门禁确认」,**禁止**把推测写成已验证。
|
|
245
|
+
- 合规分级与审查矩阵见宪章 §10.2 / §10.3。
|
|
246
|
+
|
|
247
|
+
## Git 纪律
|
|
248
|
+
|
|
249
|
+
- 提交格式 `<类型>: <简短描述>`(feat / fix / docs / refactor / test / chore),**使用中文**;
|
|
250
|
+
- **禁止** AI 归属签名(`🤖 Generated with ...`)、`Co-Authored-By:` 形式的 AI 署名、emoji;
|
|
251
|
+
- 一次提交只含一项已完成工作,禁止夹带无关文件;未过门禁不得提交;
|
|
252
|
+
- 未经用户明确授权,**不得** `git commit` / `git push` / 改写历史。
|
|
253
|
+
|
|
254
|
+
## 开发原则
|
|
255
|
+
|
|
256
|
+
1. **文档优先**:改前先 `read` / `grep` 验证 API 与现有模式,不假设文件或函数存在;
|
|
257
|
+
2. **禁止反复猜测试错**:遇报错先查权威来源(Python 官方文档、`README*.md`、本宪章)确认根因,再最小复现验证;
|
|
258
|
+
3. **最小改动**:只改任务相关代码,拒绝过度抽象(YAGNI / KISS);
|
|
259
|
+
4. **匹配现有风格**:命名、目录、抽象层级与周边代码一致;注释 / docstring 语言**按层就近一致**(核心模块英文、CLI 交互层中文,见宪章 §2.1),代码标识符一律英文,commit 用**中文**;
|
|
260
|
+
5. **同步文档**:用户可见行为变更 → 两个 README **+ `CHANGELOG.md` 的「未发布」小节**;架构 / 命令变更 → 本文档;命令或配置项增删 → 核对 §「门禁纪律」的引用点清单;
|
|
261
|
+
6. **零依赖**:不引入运行时第三方依赖(`dependencies` 保持为空);
|
|
262
|
+
7. **版本双源**:改版本号必须同时改 `pyproject.toml` 与 `gitwebhooks/__init__.py`,提交前 `grep` 复核。
|
|
263
|
+
|
|
264
|
+
## 常见陷阱
|
|
265
|
+
|
|
266
|
+
| 问题 | 说明 |
|
|
267
|
+
|------|------|
|
|
268
|
+
| **`serve` vs `service`** | 独立 `service` 子命令已移除;systemd 管理是 `serve install` / `serve uninstall`。`cli/service.py` 是内部实现模块,不是子命令。 |
|
|
269
|
+
| **版本双源** | `pyproject.toml` 与 `gitwebhooks/__init__.py` 各存一份版本号,无自动同步;`main/version.py` 从包 `__version__` 读取。 |
|
|
270
|
+
| **两处平台注册** | 新增平台须同时改 `handlers/factory.py` 与 `auth/factory.py`,并加 `handlers/<p>.py` 与 `auth/<p>.py`;漏一处会「识别了平台但无法验证」。 |
|
|
271
|
+
| **测试挂起(P0)** | 历史上两处:① `sys.exit` 被 mock 成 no-op ⇒ `while True` 无限重试;② patch 了 `gitwebhooks.main.WebhookServer`,但 `cmd_serve` 用的是 `gitwebhooks.cli.serve.WebhookServer` ⇒ **真实启动服务器**。测试若卡住,先查这两类。 |
|
|
272
|
+
| **测试因「恰好成立」而通过** | 例:用 `main([])` 断言返回码,实际走的是「打印帮助」分支;`-m gitwebhooks.cli` 恒返回 1(模块不存在),却让「配置缺失返回 1」的断言通过。断言必须对应被测行为。 |
|
|
273
|
+
| **配置常量分散风险** | 路径列表、Header 名、状态码、敏感字段关键词的唯一出处是 `utils/constants.py`;别处硬编码即漂移。 |
|
|
274
|
+
| **命令执行信任边界** | `execute_deployment` 使用 `shell=True`。安全前提是「命令只来自本地配置文件」——**禁止**把请求体内容拼进命令。 |
|
|
275
|
+
| **禁止创建无人读取的管道** | `stdout=PIPE` 而不读 ⇒ 输出超过管道缓冲区(Linux 64 KiB)后命令**永久阻塞**(「推送后没反应、无报错、无日志尾」)。当前实现用守护线程合并排空 `stdout`/`stderr` 并 `wait()` 回收;改动此处**必须**保持「有消费者 + 有回收」,回归测试见 `tests/unit/test_executor.py`。 |
|
|
276
|
+
| **CLI 文档漂移** | README 两个语言版本与 `scripts/pre-release-check.sh` 曾残留已删除的 `service` 引用;增删子命令时按引用点清单全查。 |
|
|
277
|
+
| **模块入口是 `gitwebhooks.main`** | `gitwebhooks.cli` 是子命令包,**没有** `__main__.py`,`python3 -m gitwebhooks.cli` 会失败;模块方式启动一律用 `python3 -m gitwebhooks.main`。 |
|
|
278
|
+
| **帮助只有一个来源** | 帮助文本由 argparse 从解析器定义生成:`help.py` 不再持有手写文案。改选项后 `help <cmd>` 与 `<cmd> --help` 自动同步,不要另写一份帮助字符串。 |
|
|
279
|
+
| **启动服务器必须带 `serve`** | `./gitwebhooks-cli -c file.ini`(无子命令)只打印帮助并返回 0,**不会**启动服务;正确写法是 `./gitwebhooks-cli serve -c file.ini`。文档一律以此为准。 |
|
|
280
|
+
|
|
281
|
+
## 受控文档索引
|
|
282
|
+
|
|
283
|
+
| 文档 | 内容 |
|
|
284
|
+
|------|------|
|
|
285
|
+
| [`CONSTITUTION.md`](./CONSTITUTION.md) | **编码宪章(最高准则)**:适用范围、架构不变量、安全、测试、合规分级、审查矩阵 |
|
|
286
|
+
| [`CHANGELOG.md`](./CHANGELOG.md) | **更新日志**(Keep a Changelog):各版本的用户可感知变更;发布时必须更新 |
|
|
287
|
+
| [`AGENTS.md`](./AGENTS.md)(本文档) | Agent 入口:架构、命令、门禁、陷阱 |
|
|
288
|
+
| [`README.md`](./README.md) | 用户手册(英文):安装、配置、使用、发布 |
|
|
289
|
+
| [`README.zh.md`](./README.zh.md) | 用户手册(中文) |
|
|
290
|
+
| [`gitwebhooks.ini.sample`](./gitwebhooks.ini.sample) | 配置模板 |
|
|
291
|
+
| [`.dsh/skills/code-review/SKILL.md`](./.dsh/skills/code-review/SKILL.md) | 代码审查口径与清单 |
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
# 更新日志 (Changelog)
|
|
2
|
+
|
|
3
|
+
本文件记录本项目所有值得注意的变更。
|
|
4
|
+
|
|
5
|
+
格式参考 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.1.0/),
|
|
6
|
+
版本号遵循 [语义化版本 (Semantic Versioning)](https://semver.org/lang/zh-CN/)。
|
|
7
|
+
|
|
8
|
+
变更类型:`Added / 新增`、`Changed / 变更`、`Deprecated / 弃用`、`Removed / 移除`、
|
|
9
|
+
`Fixed / 修复`、`Security / 安全`。
|
|
10
|
+
|
|
11
|
+
> **关于历史条目**:本文件自 v2.4.1 起正式维护。v2.4.1 之前没有 git tag,
|
|
12
|
+
> 早期条目由提交历史整理而成,日期取该版本最后一次提交的日期;
|
|
13
|
+
> 版本切分以历史上的 `chore: 发布版本 X` 提交为准,可能与当时 PyPI 上的上传时点存在偏差。
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## [未发布 / Unreleased]
|
|
18
|
+
|
|
19
|
+
<!-- 发布新版本时:把本节的条目移动到新的版本号小节,并更新下方链接。 -->
|
|
20
|
+
|
|
21
|
+
## [2.4.2] - 2026-10-12
|
|
22
|
+
|
|
23
|
+
> ### ⚠️ 升级注意事项(行为变更)
|
|
24
|
+
>
|
|
25
|
+
> 本版修复了一个认证绕过。**若你的配置是 `verify=true` 但 `secret` 留空,或在 custom 平台把 `header_token` 显式留空,升级后这些请求会被拒绝(401)**——
|
|
26
|
+
> 这在旧版是「静默放行」,也就是任何人只要不带 token 就能触发你的部署命令。
|
|
27
|
+
> 升级后请为每个平台配置真实的 `secret`;确实不需要验证时请显式设 `verify=false`。
|
|
28
|
+
>
|
|
29
|
+
> 另外 `[ssl] enable` 写非布尔值(如 `maybe`)从「静默当作关闭」改为直接报错退出。
|
|
30
|
+
|
|
31
|
+
### Fixed / 修复
|
|
32
|
+
|
|
33
|
+
- **测试套件会永久挂起**(全量 `pytest` 跑不完——是「卡死」不是「慢」)。两处根因:
|
|
34
|
+
① `test_ask_config_level_keyboard_interrupt_confirms` 把 `sys.exit` mock 成 no-op,
|
|
35
|
+
导致 `while True` 无限重试;② `test_main_*` 把 `gitwebhooks.main.WebhookServer` 打桩,
|
|
36
|
+
但 `cmd_serve` 实际使用 `gitwebhooks.cli.serve.WebhookServer`,于是**真的启动了服务器**。
|
|
37
|
+
- **测试套件运行时间**约 55 秒降到约 10 秒。主因是每个集成测试都要等
|
|
38
|
+
`serve_forever()` 默认 0.5 秒的 `poll_interval` 才完成 teardown;另有 17 处固定
|
|
39
|
+
`time.sleep()`(合计约 12 秒)与每次服务器启动固定 0.25 秒等待。现改为条件轮询
|
|
40
|
+
(`WebhookTestCase.wait_until` / `wait_for_file` / `wait_for_log_contains`)。
|
|
41
|
+
- 修复若干**从未真正运行过**的测试(此前因缺少 pytest 而整体无法导入):
|
|
42
|
+
- `tests/unit/test_main.py` 3 个用例断言的是重构前的 CLI(无子命令即启动服务器);
|
|
43
|
+
- `tests/unit/test_install_service_logic.py` 导入了已被删除的 `cmd_install`;
|
|
44
|
+
- `tests/integration/test_config_discovery.py` 在 `cwd=tmp_path` 下未传 `PYTHONPATH`,
|
|
45
|
+
且自身推算仓库根路径多了一层。
|
|
46
|
+
- `tests/unit/test_config_loading.py` 用 `python -m gitwebhooks.cli`(该模块不可执行)
|
|
47
|
+
断言返回码 1,属于**因错误原因通过**;改用 `python -m gitwebhooks.main serve`,
|
|
48
|
+
现在真正验证配置缺失 / 非法 INI 的处理。
|
|
49
|
+
- `tests/integration/test_edge_cases.py::test_large_command_output_handled` 名为「大输出」,
|
|
50
|
+
实际把输出**重定向进文件**,从未经过管道——正是它让管道阻塞缺陷长期未被发现。
|
|
51
|
+
- `.gitignore` 现在覆盖 `*.env`(此前 `secret.env` 等不会被忽略)。
|
|
52
|
+
- `scripts/pre-release-check.sh` 不再吞掉全部输出(原先连构建与安装都 `>/dev/null 2>&1`,
|
|
53
|
+
失败时没有任何线索);现为成功静默、失败打印完整输出。
|
|
54
|
+
- **部署命令输出超过管道缓冲区后会永久卡死**(表现为「推送后没反应、无报错、无日志尾」)。
|
|
55
|
+
`execute_deployment` 原先用 `stdout=PIPE, stderr=PIPE` 启动命令却**从不读取**这两个管道,
|
|
56
|
+
且 `Popen` 对象被直接丢弃 ⇒ 进程一直留在 `subprocess._active`、**管道读端永不释放**,
|
|
57
|
+
命令输出超过管道缓冲区(Linux 默认 64 KiB)后写端阻塞在 `write()`。
|
|
58
|
+
`composer install`、`git reset --hard`、`npm ci`、`docker build` 等输出量足以触发。
|
|
59
|
+
现由守护线程持续排空 stdout/stderr(合并读取)并在结束后 `wait()` 回收子进程。
|
|
60
|
+
- 部署失败(非 0 退出码)现在会记录退出码与输出尾部,此前完全无迹可查。
|
|
61
|
+
- 声明的最低 Python 版本修正为 **3.7**(原为 `>=3.6` 并带 3.6 分类器)。
|
|
62
|
+
包在 import 阶段即依赖 `dataclasses`(Python 3.7+ 才有),此前 3.6 用户会安装成功、
|
|
63
|
+
但 `import gitwebhooks` 必然失败。
|
|
64
|
+
- **安全:空 secret 会放行未认证请求**。`gitlab` / `gitee` / `custom` 三个验证器直接比较
|
|
65
|
+
`signature == secret`,当配置里 `secret` 为空且请求未带 token 时 `'' == ''` 成立,
|
|
66
|
+
于是 `verify=True` 形同虚设——而未认证的 webhook 会触发部署命令(任意 shell)。
|
|
67
|
+
`github` 验证器本就有 `if not secret` 保护,现三者也补上同样的保护。
|
|
68
|
+
- **声明支持的 Python 3.7 / 3.8 实际无法启动 CLI**:`cli/init_wizard.py` 用了
|
|
69
|
+
PEP 585 的 `tuple[bool, str]` 注解(3.9+ 才有),且没有 `from __future__ import annotations`;
|
|
70
|
+
该模块在 `main → cli → cli.config → init_wizard` 链上被无条件导入,故 3.7/3.8 上
|
|
71
|
+
`gitwebhooks-cli` 直接 `TypeError: 'type' object is not subscriptable`。改用 `typing.Tuple`。
|
|
72
|
+
- **`custom` 在 `header_token` 显式留空时静默跳过验证**:`verify_enabled` 由「Header 名是否非空」
|
|
73
|
+
推导,因此 `verify=true` + `header_token=` 会让验证器无条件返回成功(违反宪章 §5.3)。
|
|
74
|
+
现改为由 `config.verify` 决定:`verify=false` 才放行,`verify=true` 必须真正校验。
|
|
75
|
+
- `[ssl] enable` 写错(如 `maybe`)原先被静默当作「未启用 SSL」;现抛 `ConfigurationError`。
|
|
76
|
+
- pipx 自动探测用了过时的 venv 名 `gitwebhooks-server`(包名是 `gitwebhooks`),该分支实际不可达。
|
|
77
|
+
- `serve uninstall --purge` 删错文件:`cli/service.py` 写的是 `~/.gitwebhook.ini`(少一个 s),
|
|
78
|
+
与真实路径 `~/.gitwebhooks.ini` 不符,导致配置文件从未被清理。
|
|
79
|
+
- 配置错误不再抛原生异常:`[ssl] enable=true` 但缺 `key_file`/`cert_file` 时原先冒泡
|
|
80
|
+
`configparser.NoOptionError`,`[server] port` 非整数时冒泡 `ValueError`;现均转为
|
|
81
|
+
带明确说明的 `ConfigurationError`。
|
|
82
|
+
- `gitwebhooks.ini.sample` 现在可直接运行:原先 `[ssl] enable=true` 配占位证书路径、
|
|
83
|
+
且 `log_file=/var/log/...` 非 root 不可写,导致文档推荐的「从源码运行」命令必定失败。
|
|
84
|
+
- README 中的 `~/.gitwebhook.ini` / `~/.gitwebhook.log` 拼写错误(共 12 处,中英各 6),
|
|
85
|
+
以及交互向导的默认日志路径同款拼写错误。
|
|
86
|
+
|
|
87
|
+
### Changed / 变更
|
|
88
|
+
|
|
89
|
+
- **完整测试套件改用 `python3 -m pytest tests/`**(`pytest` 本就是 `pyproject.toml` 的
|
|
90
|
+
dev extra),共 228 个测试;`python3 -m tests` 明确为**零依赖子集运行器**(128 个),
|
|
91
|
+
不再被当作「测试全通过」的依据。宪章 §6.1 / §7.1 同步更新。
|
|
92
|
+
- 去除 `gitwebhooks/cli/serve.py` 中与 `gitwebhooks/main/__init__.py` 重复的
|
|
93
|
+
`find_config_file` 与 `format_config_error`(两份实现已漂移),改为复用后者。
|
|
94
|
+
- `execute_deployment` 现在返回排空输出的工作线程(`Optional[threading.Thread]`),
|
|
95
|
+
便于调用方按需 join;原有调用方忽略返回值即可,行为不变。
|
|
96
|
+
- 部署输出逐行记入日志(DEBUG 级),失败时把尾部重新以 WARNING 级输出。
|
|
97
|
+
- **常量集中(宪章 §1.2/§1.3)**:各 handler 改为使用 `utils/constants.py` 的 Header 常量
|
|
98
|
+
(原先硬编码 `'X-Hub-Signature'` 等字面量);`config/loader.py` 的保留节名改用
|
|
99
|
+
`RESERVED_SECTIONS`;`cli/service.py` 与 `cli/init_wizard.py` 的配置路径改用
|
|
100
|
+
`CONFIG_PATH_USER/LOCAL/SYSTEM`,不再各自硬编码路径列表。
|
|
101
|
+
- 交互向导的配置级别菜单文案改用 `CONFIG_PATH_*` 常量(原先硬编码三个路径,已与常量漂移)。
|
|
102
|
+
- README 的测试命令改为 `python3 -m pytest tests/`(完整套件);原先写 `python3 -m unittest discover tests/`,
|
|
103
|
+
在未装 pytest 的环境下会报 5 个导入错误并退出非 0,且它并不是完整套件。
|
|
104
|
+
- 测试辅助类 `TestServer` / `TestConfigBuilder` / `TestWebhookClient` 加 `__test__ = False`,
|
|
105
|
+
消除 pytest 的 26 条 `PytestCollectionWarning`。
|
|
106
|
+
- `execute_deployment` 的 `shell=True` 处补上信任边界注释(宪章 §5.2 要求)。
|
|
107
|
+
|
|
108
|
+
### Removed / 移除
|
|
109
|
+
|
|
110
|
+
- 死代码清理(宪章 §3.2「零死代码」):
|
|
111
|
+
- 10 个未使用的 import;
|
|
112
|
+
- 8 个无任何引用的函数:`check_systemd`、`get_cli_path`、`confirm_overwrite`、
|
|
113
|
+
`ask_question`、`validate_address`、`validate_path`、`validate_bool`、`validate_text`;
|
|
114
|
+
- `tests/utils/server_manager.py` 的 `TestServerProcess` 死类(同时含未使用的
|
|
115
|
+
`cli_script` 变量、指向不可执行模块的 `-m gitwebhooks.cli`,以及同款「创建未读管道」缺陷);
|
|
116
|
+
- 无引用的测试工具 `tests/utils/certificate_generator.py` 与 `tests/utils/coverage_runner.py`。
|
|
117
|
+
- 6 个无引用的类方法:`VerifierFactory.get_verifier`、`HandlerFactory.from_headers`、
|
|
118
|
+
`ConfigurationRegistry.get_provider_config` / `get_repository_config` / `has_repository`、
|
|
119
|
+
`WebhookRequest.repo_identifier`;
|
|
120
|
+
- 4 个无引用常量:`prompts.QUESTIONS`、`prompts.PLATFORM_QUESTIONS`、
|
|
121
|
+
`service.E_SYSTEMD`、`service.E_EXISTS`;
|
|
122
|
+
- 生产与测试中共 20 处未使用的 import(上一轮只清理了生产侧 10 处)。
|
|
123
|
+
- 第二轮(独立复查发现):`WebhookHandler.get_provider` 及 4 个平台覆写、
|
|
124
|
+
`tests/conftest.py` 的 5 个未被调用的辅助函数、`_read_log_file`、
|
|
125
|
+
9 个 `PayloadBuilder` 方法与 `generate_invalid_signature`、
|
|
126
|
+
14 个无引用的 fixture 常量,以及由此产生的 5 处 `Provider` 孤儿 import。
|
|
127
|
+
|
|
128
|
+
## [2.4.1] - 2026-10-12
|
|
129
|
+
|
|
130
|
+
### Fixed / 修复
|
|
131
|
+
|
|
132
|
+
- **`-h` / `--help` 现在遵循标准 Unix 约定**:在主命令与每个子命令层级都可用,
|
|
133
|
+
输出到 stdout,退出码为 `0`。此前它会打印 `Error: -h/--help parameters are not supported.`
|
|
134
|
+
并以退出码 `1` 结束。
|
|
135
|
+
- 帮助文本改为**由 argparse 从解析器定义生成**,`help <命令>` 与 `<命令> --help`
|
|
136
|
+
输出完全一致;删除 `cli/help.py` 中重复维护的手写帮助文案。
|
|
137
|
+
- 修正文档中已失效的命令引用:
|
|
138
|
+
- 启动服务器必须带 `serve` 子命令(`./gitwebhooks-cli serve -c file.ini`);
|
|
139
|
+
原文档写作 `./gitwebhooks-cli -c file.ini`,实际只会打印帮助。
|
|
140
|
+
- 模块入口是 `python3 -m gitwebhooks.main`(`gitwebhooks.cli` 无 `__main__.py`)。
|
|
141
|
+
- README 结构树删除不存在的 `cli.py` 与 `install.sh`。
|
|
142
|
+
- `cli/init_wizard.py` 的完成提示、`scripts/pre-release-check.sh` 的 CLI 检查
|
|
143
|
+
此前仍指向已移除的 `service` 子命令(导致发布前检查实际失效)。
|
|
144
|
+
|
|
145
|
+
### Changed / 变更
|
|
146
|
+
|
|
147
|
+
- `-v` / `--version` 注册为 argparse 参数,因此会出现在 `--help` 中;
|
|
148
|
+
不再由 `main()` 的预检查拦截(该预检查还会让 `serve -v` 意外打印版本号)。
|
|
149
|
+
- 新增 `tests/unit/cli/test_help.py`(基于 `unittest`)覆盖各层级 `help`/`version`
|
|
150
|
+
的退出码、输出流与 `help <cmd>` ≡ `<cmd> --help` 的一致性。
|
|
151
|
+
|
|
152
|
+
### 工程与治理 / Tooling & Governance
|
|
153
|
+
|
|
154
|
+
- 迁移到 DSH 管理:新增 `CONSTITUTION.md`(项目编码宪章)与
|
|
155
|
+
`.dsh/skills/code-review`(代码审查技能);`CLAUDE.md` 由 `AGENTS.md` 取代。
|
|
156
|
+
- 清理其他 agent 工具残留:`.claude/`、`.specify/`、`.gitignore` 中的 SpecKit 段落、
|
|
157
|
+
4 个空的 `tests/test_*` 目录。
|
|
158
|
+
- 修正 `.gitignore` 中拼错的配置文件名(`.gitwebhook.ini` → `.gitwebhooks.ini`),
|
|
159
|
+
避免用户本地配置与密钥被误提交。
|
|
160
|
+
|
|
161
|
+
## [2.4.0] - 2026-01-16
|
|
162
|
+
|
|
163
|
+
### Removed / 移除
|
|
164
|
+
|
|
165
|
+
- 彻底移除 `service` 子命令及其向后兼容代码;systemd 服务管理改由
|
|
166
|
+
`serve install` / `serve uninstall` 承担(`gitwebhooks/cli/service.py` 保留为内部实现模块)。
|
|
167
|
+
|
|
168
|
+
## [2.3.1] - 2026-01-16
|
|
169
|
+
|
|
170
|
+
### Fixed / 修复
|
|
171
|
+
|
|
172
|
+
- 修复 `serve` 命令显示弃用警告的问题。
|
|
173
|
+
- 恢复被误删的 `gitwebhooks-cli` 脚本。
|
|
174
|
+
|
|
175
|
+
## [2.3.0] - 2026-01-16
|
|
176
|
+
|
|
177
|
+
### Added / 新增
|
|
178
|
+
|
|
179
|
+
- 服务安装时的配置级别选择:`serve install --config-level user|local|system`。
|
|
180
|
+
|
|
181
|
+
### Changed / 变更
|
|
182
|
+
|
|
183
|
+
- 重构 CLI 命令结构,使其符合标准 Unix 工具规范。
|
|
184
|
+
|
|
185
|
+
> 注:本次发布提交(`chore: 发布版本 2.3.0`)中 `pyproject.toml` 的版本号仍为 `2.2.0`,
|
|
186
|
+
> 版本号是在紧随其后的 `chore: 更新 pyproject.toml 版本号到 2.3.0` 中才更新的。
|
|
187
|
+
|
|
188
|
+
## [2.2.0] - 2026-01-15
|
|
189
|
+
|
|
190
|
+
### Added / 新增
|
|
191
|
+
|
|
192
|
+
- 配置文件优先级自动查找:未指定 `-c` 时依次查找
|
|
193
|
+
`~/.gitwebhooks.ini` → `/usr/local/etc/gitwebhooks.ini` → `/etc/gitwebhooks.ini`。
|
|
194
|
+
|
|
195
|
+
## [2.1.4] - 2026-01-15
|
|
196
|
+
|
|
197
|
+
### Changed / 变更
|
|
198
|
+
|
|
199
|
+
- 统一项目命名为 `gitwebhooks`。
|
|
200
|
+
|
|
201
|
+
### Fixed / 修复
|
|
202
|
+
|
|
203
|
+
- 修复多个测试与实现问题。
|
|
204
|
+
|
|
205
|
+
## [2.1.3] - 2026-01-14
|
|
206
|
+
|
|
207
|
+
### Fixed / 修复
|
|
208
|
+
|
|
209
|
+
- 修复配置初始化向导的多个问题。
|
|
210
|
+
- 恢复被误删的 `constitution.md`。
|
|
211
|
+
|
|
212
|
+
## [2.1.2] - 2026-01-14
|
|
213
|
+
|
|
214
|
+
### Added / 新增
|
|
215
|
+
|
|
216
|
+
- 发布前验证流程:`scripts/pre-release-check.sh`(构建 + 隔离环境安装 + CLI 冒烟)。
|
|
217
|
+
|
|
218
|
+
### Fixed / 修复
|
|
219
|
+
|
|
220
|
+
- 修复 CLI 入口点配置:`gitwebhooks.cli:main` → `gitwebhooks.main:main`。
|
|
221
|
+
|
|
222
|
+
## [2.1.1] - 2026-01-14
|
|
223
|
+
|
|
224
|
+
### Fixed / 修复
|
|
225
|
+
|
|
226
|
+
- 修正 README 中的包名(`git-webhooks-server` → `gitwebhooks`)。
|
|
227
|
+
|
|
228
|
+
## [2.1.0] - 2026-01-14
|
|
229
|
+
|
|
230
|
+
### Added / 新增
|
|
231
|
+
|
|
232
|
+
- 安装方法指导与服务文件自适应功能。
|
|
233
|
+
|
|
234
|
+
## [2.0.0] - 2026-01-14
|
|
235
|
+
|
|
236
|
+
首个发布到 PyPI 的版本,将原单文件实现重构为模块化包。
|
|
237
|
+
|
|
238
|
+
### Added / 新增
|
|
239
|
+
|
|
240
|
+
- 模块化包结构 `gitwebhooks/`:`models/`、`config/`、`auth/`、`handlers/`、`utils/`、`logging/`。
|
|
241
|
+
- 完整测试套件(单元测试 + 集成测试)。
|
|
242
|
+
- CLI 子命令取代 `install.sh`:`config init`(交互式配置向导)、`config view`(查看配置,敏感字段高亮)。
|
|
243
|
+
|
|
244
|
+
### Changed / 变更
|
|
245
|
+
|
|
246
|
+
- 安装方式简化为原地运行模式。
|
|
247
|
+
- 源码按模块拆分,所有源码注释统一为英文。
|
|
248
|
+
|
|
249
|
+
### Fixed / 修复
|
|
250
|
+
|
|
251
|
+
- 修复 Gitee webhook 签名验证算法。
|
|
252
|
+
- 修复 `install.sh --uninstall` 参数不生效的问题。
|
|
253
|
+
- 修复服务模板与安装脚本缺少 `WorkingDirectory` 的问题。
|
|
254
|
+
- 修复服务文件创建问题,并增加详细模式。
|
|
255
|
+
|
|
256
|
+
### Removed / 移除
|
|
257
|
+
|
|
258
|
+
- 移除旧的单文件实现与 `install.sh`。
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## 2.0.0 之前(未发布到 PyPI)
|
|
263
|
+
|
|
264
|
+
2020–2022 年间为单文件实现(`git-webhooks-server.py`),已具备以下能力:
|
|
265
|
+
|
|
266
|
+
- 支持 GitHub、Gitee、GitLab 与自定义 webhook 源。
|
|
267
|
+
- 按 Header 识别平台;支持签名 / token / 密码验证。
|
|
268
|
+
- 支持指定需要处理的事件类型(`handle_events`)。
|
|
269
|
+
- 自定义 webhook 通过 `identifier_path` 提取仓库标识。
|
|
270
|
+
- 支持 SSL。
|
|
271
|
+
- 修复重启后服务无法启动的问题。
|
|
272
|
+
|
|
273
|
+
[未发布 / Unreleased]: https://gitee.com/holyhi/git-webhooks-server/compare/v2.4.2...HEAD
|
|
274
|
+
[2.4.2]: https://pypi.org/project/gitwebhooks/2.4.2/
|
|
275
|
+
[2.4.1]: https://pypi.org/project/gitwebhooks/2.4.1/
|
|
276
|
+
[2.4.0]: https://pypi.org/project/gitwebhooks/2.4.0/
|
|
277
|
+
[2.3.1]: https://pypi.org/project/gitwebhooks/2.3.1/
|
|
278
|
+
[2.3.0]: https://pypi.org/project/gitwebhooks/2.3.0/
|
|
279
|
+
[2.2.0]: https://pypi.org/project/gitwebhooks/2.2.0/
|
|
280
|
+
[2.1.4]: https://pypi.org/project/gitwebhooks/2.1.4/
|
|
281
|
+
[2.1.3]: https://pypi.org/project/gitwebhooks/2.1.3/
|
|
282
|
+
[2.1.2]: https://pypi.org/project/gitwebhooks/2.1.2/
|
|
283
|
+
[2.1.1]: https://pypi.org/project/gitwebhooks/2.1.1/
|
|
284
|
+
[2.1.0]: https://pypi.org/project/gitwebhooks/2.1.0/
|
|
285
|
+
[2.0.0]: https://pypi.org/project/gitwebhooks/2.0.0/
|