コード オーナー開発ガイドライン
GitLab 15.10 で導入されました。
このドキュメントは、貢献者がコードオーナーのコード設計を理解するために作成されました。この機能のコードに変更を加える前に、このドキュメントを読んでください。
コードは頻繁に変更される可能性があるため、このドキュメントは意図的にコードがどのように設計されているかの概要に限定しています。この機能の特定の部分がどのように動作するかを理解するには、コードと仕様を参照してください。ここでは、Code Owners 機能の主なコンポーネントの動作について説明します。
ビジネスロジック
コード・オーナーのビジネス・ロジックは、すべてGitlab::CodeOwners
ネームスペースにあります。コードオーナーはEEのみの機能であるため、ファイルは./ee
ディレクトリにのみ存在します。
-
Gitlab::CodeOwners
コード・オーナー・ルールとの対話に使用されるメイン・モジュール。-
./ee/lib/gitlab/code_owners.rb
で定義されています。
-
-
Gitlab::CodeOwners::File
CODEOWNERS
ファイルをラップし、クラスの公開メソッドを通してデータを公開します。-
./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::UsersLoader
CODEOWNER
、コンテンツを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::Validator
require_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
ファイルにも記載されているマージリクエストの各変更ファイルに対して、コードオーナー承認ルールを作成します。
フロー
これらのフローチャートは、コントローラから各機能のモデルまでの流れを説明するのに役立つはずです。