コード オーナー開発ガイドライン

GitLab 15.10 で導入されました

このドキュメントは、貢献者がコードオーナーのコード設計を理解するために作成されました。この機能のコードに変更を加える前に、このドキュメントを読んでください。

コードは頻繁に変更される可能性があるため、このドキュメントは意図的にコードがどのように設計されているかの概要に限定しています。この機能の特定の部分がどのように動作するかを理解するには、コードと仕様を参照してください。ここでは、Code Owners 機能の主なコンポーネントの動作について説明します。

note
このドキュメントで参照されているコードベースの一部が更新されたり、削除されたり、新しい部分が追加されたりした場合は、このドキュメントを更新する必要があります。

ビジネスロジック

コード・オーナーのビジネス・ロジックは、すべて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 ファイルにも記載されているマージリクエストの各変更ファイルに対して、コードオーナー承認ルールを作成します。

フロー

これらのフローチャートは、コントローラから各機能のモデルまでの流れを説明するのに役立つはずです。

require_code_owner_approval を有効にして、保護されたブランチに変更をプッシュします。

graph TD Api::Internal::Base --> Gitlab::GitAccess Gitlab::GitAccess --> Gitlab::Checks::DiffCheck Gitlab::Checks::DiffCheck --> Gitlab::CodeOwners::Validator Gitlab::CodeOwners::Validator --> ProtectedBranch Gitlab::CodeOwners::Validator --> Gitlab::CodeOwners::Loader Gitlab::CodeOwners::Loader --> Gitlab::CodeOwners::Entry

コードオーナールールをマージリクエスト承認ルールに同期

graph TD EE::ProtectedBranches::CreateService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequestRefreshService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequests::ReloadMergeHeadDiffService --> MergeRequest::SyncCodeOwnerApprovalRules EE::MergeRequests::CreateService --> MergeRequests::SyncCodeOwnerApprovalRulesWorker EE::MergeRequests::UpdateService --> MergeRequests::SyncCodeOwnerApprovalRulesWorker MergeRequests::SyncCodeOwnerApprovalRulesWorker --> MergeRequest::SyncCodeOwnerApprovalRules MergeRequest::SyncCodeOwnerApprovalRules --> id1{delete outdated code owner rules} MergeRequest::SyncCodeOwnerApprovalRules --> id2{create rule for each code owner entry}