feat: Add automatic CODEOWNERS reviewer assignment

Summary

Implements automatic assignment of code owners as reviewers when merge requests are created or updated, addressing &20708.

Problem

GitLab currently creates CODEOWNERS approval rules automatically via SyncCodeOwnerApprovalRules, but users must still manually assign reviewers. This creates friction, especially for large organizations with established ownership patterns. Major competing platforms offer this as standard functionality.

Solution

This MR adds a configurable automatic reviewer assignment feature that:

  1. Leverages existing infrastructure - Reads from ApprovalMergeRequestRule records already created by SyncCodeOwnerApprovalRules

  2. Supports multiple strategies via project settings:

    • disabled (default) - No automatic assignment
    • all_members - Assigns all code owner members
    • load_balanced - Respects approvals_required from CODEOWNERS sections, selects reviewers based on current review load
    • intelligent - Reserved for Phase 2 DAP integration (falls back to load_balanced)
  3. Designed for extensibility - Strategy pattern allows easy addition of Phase 2 DAP-powered intelligent selection

Technical Implementation

New Files

File Purpose
ee/app/services/merge_requests/assign_code_owner_reviewers_service.rb Main orchestration service
ee/app/services/merge_requests/reviewer_assignment/base_strategy.rb Base class for selection strategies
ee/app/services/merge_requests/reviewer_assignment/all_members_strategy.rb Assigns all eligible members
ee/app/services/merge_requests/reviewer_assignment/load_balanced_strategy.rb Load-balanced selection with N-of-M support
ee/app/services/merge_requests/reviewer_assignment/strategy_factory.rb Builds appropriate strategy based on settings
ee/app/workers/merge_requests/assign_code_owner_reviewers_worker.rb Background worker for async processing
ee/app/models/concerns/code_owner_reviewer_assignment_strategy.rb Enum concern for project settings

Database Changes

Adds code_owner_reviewer_assignment_strategy smallint column to project_settings table.

Metrics

Tracked via Internal Events:

  • auto_assign_code_owner_reviewers - Fires on each assignment with strategy label and reviewer count
  • enable_code_owner_reviewer_auto_assignment - Fires when feature is enabled

Phase 2 Preparation

The intelligent strategy is stubbed and falls back to load_balanced. Phase 2 will add DAP integration for ML-powered reviewer selection.

Testing

  • Unit tests for all strategies
  • Service specs with various scenarios
  • Worker specs

TODO (follow-up MRs)

  • Trigger worker from SyncCodeOwnerApprovalRules completion
  • Add project settings UI toggle
  • Add MR interface indicators for auto-assigned reviewers
  • Documentation
  • Epic: &20708
  • Related: &20656 (Phase 2 - Intelligent Assignment)

Merge request reports

Loading