Help us learn about your current experience with the documentation. Take the survey.
推送规则开发指南
本文档旨在帮助贡献者理解 push rules 的代码设计。在为此功能修改代码之前,您应该阅读本文档。
由于代码经常变动,本文档仅概述了其设计方式。要了解功能特定部分的工作原理,请查看代码和规范 (specs)。此处的细节解释了推送规则功能的主要组件是如何工作的。
当本文档中引用的代码库部分被更新、移除或添加新部分时,应更新本文档。
业务逻辑
业务逻辑主要包含在以下部分:PushRule 模型存储规则的设置,然后我们有使用这些设置来更改推送行为的检查。
PushRule:用于存储每个推送规则配置的主要模型。- 定义于
ee/app/models/push_rule.rb。
- 定义于
EE::Gitlab::Checks::DiffCheck:差异检查会阻止与推送规则的file_name_regex匹配的文件名,以及与已知密钥文件(例如id_rsa)匹配的文件名。- 定义于
ee/lib/ee/gitlab/checks/diff_check.rb。
- 定义于
EE::Gitlab::Checks::PushRuleCheck:执行各种推送规则检查。- 定义于
ee/lib/ee/gitlab/checks/push_rule_check.rb。
- 定义于
EE::Gitlab::Checks::PushRules::BranchCheck:执行与分支规则相关的推送规则检查。- 定义于
ee/lib/ee/gitlab/checks/push_rules/branch_check.rb。
- 定义于
EE::Gitlab::Checks::PushRules::CommitCheck:执行与提交规则相关的推送规则检查。- 定义于
ee/lib/ee/gitlab/checks/push_rules/commit_check.rb。
- 定义于
EE::Gitlab::Checks::FileSizeLimtCheck:执行与文件大小规则相关的推送规则检查。- 定义于
ee/lib/ee/gitlab/checks/file_size_limit_check.rb。
- 定义于
EE::Gitlab::Checks::PushRules::TagCheck:执行与标签规则相关的推送规则检查。- 定义于
ee/lib/ee/gitlab/checks/push_rules/tag_check.rb。
- 定义于
入口点
以下控制器和 API 都是进入推送规则逻辑的入口点:
Admin::PushRulesController:此控制器用于管理全局推送规则。Group::PushRulesController:此控制器用于管理群组级别的推送规则。Project::PushRulesController:此控制器用于管理项目级别的推送规则。Api::Internal::Base:当通过 SSH 推送到 GitLab 时,会调用此/internal/allowed端点以确保用户被允许推送。/internal/allowed端点会执行Gitlab::Checks::DiffCheck。在 EE 版本中,这包括推送规则检查。- 定义于
lib/api/internal/base.rb。
- 定义于
Repositories::GitHttpController:当通过 HTTP 将更改推送到 GitLab 时,控制器会执行访问检查以确保用户被允许推送。这些检查会执行Gitlab::Checks::DiffCheck。在 EE 版本中,这包括推送规则检查。- 定义于
app/controllers/repositories/git_http_controller.rb。
- 定义于
流程
这些流程图应该有助于解释从控制器到不同功能模型的流程。
通过 SSH 进行 Git 推送
%%{init: { "fontFamily": "GitLab Sans" }}%%
graph TD
Repositories::GitHttpController --> Gitlab::GitAccess
Api::Internal::Base --> Gitlab::GitAccess
Gitlab::GitAccess --> Gitlab::Checks::ChangesAccess
Gitlab::Checks::ChangesAccess --> Gitlab::Checks::SingleChangeAccess
Gitlab::Checks::ChangesAccess --> EE::Gitlab::Checks::PushRuleCheck
Gitlab::Checks::SingleChangeAccess --> Gitlab::Checks::DiffCheck
EE::Gitlab::Checks::PushRuleCheck -->|仅在推送到标签时| EE::Gitlab::Checks::PushRules::TagCheck
EE::Gitlab::Checks::PushRuleCheck -->|仅在推送到分支时| EE::Gitlab::Checks::PushRules::BranchCheck
Gitlab::Checks::ChangesAccess --> EE::Gitlab::Checks::FileSizeLimitCheck
仅当 parallel_push_checks 功能标志启用时,PushRuleCheck 才会并行触发检查。否则,标签或分支检查会先运行,然后是文件大小检查。