コード オーナー開発ガイドライン
GitLab 15.10 で導入されました。
このドキュメントは、貢献者がコードオーナーのコード設計を理解するために作成されました。この機能のコードに変更を加える前に、このドキュメントを読んでください。
コードは頻繁に変更される可能性があるため、このドキュメントは意図的にコードがどのように設計されているかの概要に限定しています。この機能の特定の部分がどのように動作するかを理解するには、コードと仕様を参照してください。ここでは、Code Owners 機能の主なコンポーネントの動作について説明します。
ビジネスロジック
コード・オーナーのビジネス・ロジックは、すべてGitlab::CodeOwners ネームスペースにあります。コードオーナーはEEのみの機能であるため、ファイルは./ee ディレクトリにのみ存在します。
-
Gitlab::CodeOwnersコード・オーナー・ルールとの対話に使用されるメイン・モジュール。-
./ee/lib/gitlab/code_owners.rbで定義されています。
-
-
Gitlab::CodeOwners::FileCODEOWNERSファイルをラップし、クラスの公開メソッドを通してデータを公開します。-
./ee/lib/gitlab/code_owners/file.rbで定義されています。
-
-
Gitlab::CodeOwners::Section:CODEOWNERSファイルからセクション見出しをラップし、異なる部分を解析します。-
./ee/lib/gitlab/code_owners/section.rbで定義されています。
-
-
Gitlab::CodeOwners::Entry:CODEOWNERSファイルのエントリ (パターンとオーナー行) をラップし、クラスの公開メソッドを通してデータを公開します。-
./ee/lib/gitlab/code_owners/entry.rbで定義されています。
-
-
Gitlab::CodeOwners::Loader: 正しいCODEOWNERファイルを見つけ、コンテンツをGitlab::CodeOwners::Fileインスタンスにロードします。-
./ee/lib/gitlab/code_owners/loader.rbで定義されています。
-
-
Gitlab::CodeOwners::ReferenceExtractor: テキストからCODEOWNERユーザー、グループ、メール参照を抽出します。-
./ee/lib/gitlab/code_owners/reference_extractor.rbで定義されています。
-
-
Gitlab::CodeOwners::UsersLoaderCODEOWNER、コンテンツをGitlab::CodeOwners::Fileインスタンスにロードします。-
./ee/lib/gitlab/code_owners/users_loader.rbで定義されています。
-
-
Gitlab::CodeOwners::GroupsLoader: 正しいCODEOWNERファイルを見つけ、コンテンツをGitlab::CodeOwners::Fileインスタンスにロードします。-
./ee/lib/gitlab/code_owners/groups_loader.rbで定義されています。
-
-
Gitlab::CodeOwners::Validatorrequire_code_owner_approvalが有効になっている保護ブランチにユーザーがプッシュしたときに、CODEOWNERSのエントリのファイルが変更されていないことを確認します。-
./ee/lib/gitlab/code_owners/validator.rbで定義されています。
-
関連モデル
ProtectedBranch
ProtectedBranch モデルはapp/models/protected_branch.rb で定義され、ee/app/ee/models/protected_branch.rb で拡張されています。EE バージョンには、require_code_owner_approval というカラムがあり、ファイルがCODEOWNERSにリストされている場合、変更が保護対象のブランチに直接プッシュされるのを防ぎます。
ApprovalMergeRequestRule
ApprovalMergeRequestRule モデルはee/app/models/approval_merge_request_rule.rb で定義されています。このモデルはマージリクエストの承認者ルールを格納します。code_owner タイプのルールを含む、複数のルールタイプを使用します。
コントローラーとサービス
承認ルール機能を動作させるために、以下のコントローラとサービスを使用しています:
Api::Internal::Base
この/internal/allowed エンドポイントは、GitLab にプッシュするときに呼び出され、ユーザーがプッシュを許可されて /internal/allowedいることを確認します。/internal/allowed この /internal/allowedエンドポイントはGitlab::Checks::DiffCheck を実行します。 EE では、これにはコードオーナーのチェックも含まれます。
lib/api/internal/base.rb で定義されています。
Repositories::GitHttpController
変更が GitLab に HTTP でプッシュされると、コントローラはそのユーザーがプッシュを許可されているかどうかをチェックします。このチェックは、Gitlab::Checks::DiffCheck 。 EE内部では、コードオーナーチェックを含みます。
app/controllers/repositories/git_http_controller.rb で定義されています。
EE::Gitlab::Checks::DiffCheck
このモジュールは CEGitlab::Checks::DiffChecks クラスを拡張し、コードオーナーの検証を追加します。Gitlab::CodeOwner::Validator クラスを使用して、CODEOWNER にリストされているファイルを、ブランチがコードオーナーの承認を必要としている間に、ユーザーが直接 protected ブランチにプッシュしていないかどうかを検証します。
MergeRequests::SyncCodeOwnerApprovalRules
このサービスはservices/merge_requests/sync_code_owner_approval_rules.rb で定義されています:
- 新しい変更がマージリクエストにプッシュされたときに、古いコードオーナーの承認ルールを削除します。
-
CODEOWNERファイルにも記載されているマージリクエストの各変更ファイルに対して、コードオーナー承認ルールを作成します。
フロー
これらのフローチャートは、コントローラから各機能のモデルまでの流れを説明するのに役立つはずです。