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 才会并行触发检查。否则,标签或分支检查会先运行,然后是文件大小检查。