CODEOWNERS - текстовый файл в репо, где каждая строка привязывает glob-паттерн пути к owner'у (команде или пользователю). Когда открывается PR, GitHub читает CODEOWNERS, смотрит изменённые файлы, и автоматически добавляет owner'ов в reviewers.
Расположение
Один из трёх путей, GitHub найдёт:
.github/CODEOWNERS(наиболее распространённый)CODEOWNERSв корнеdocs/CODEOWNERS
Хранить в .github/CODEOWNERS обычно удобнее: вся
GitHub-специфичная конфигурация в одном месте.
Синтаксис
Похож на .gitignore, но вместо игнорирования - назначение
owner'а:
# глобальный fallback
* @acme/leads
# backend
/backend/ @acme/backend
/backend/db/migrations/ @acme/database
# frontend
/frontend/ @acme/frontend
*.tsx @acme/frontend
# документация
*.md @acme/docs
# один конкретный файл
/SECURITY.md @alice @bob
# OR-логика: любой из перечисленных
/infra/ @acme/devops @acme/sre
Owner'ом может быть:
@username- конкретный пользователь@org/team-name- команда внутри организацииemail@example.com- валидный email связанный с GitHub-аккаунтом
Правило «последний выигрывает»
Если файл попадает под несколько правил, побеждает последнее совпадение. Поэтому общие правила пишут сверху, специфичные - снизу:
* @acme/leads # сначала общее
/backend/ @acme/backend # потом backend
/backend/db/ @acme/database # ещё специфичнее
Файл /backend/db/migration/0042.py принадлежит @acme/database,
не @acme/backend - потому что /backend/db/ определён позже и
более специфичен.
В связке с branch protection
Сам по себе CODEOWNERS только назначает reviewers. Чтобы заблокировать merge без их approve, в branch-protection нужна галка «Require review from Code Owners». Тогда:
- PR трогает
/backend/db/. - Назначается
@acme/database. - Merge заблокирован до approve от кого-то из этой team.
Подводные камни
- Team должна иметь access к репо. Если ты упомянул
@acme/databaseв CODEOWNERS, но команда не добавлена в Settings -> Manage access - GitHub пропустит назначение. - Owner не равно автор кода. CODEOWNERS - кто отвечает сейчас, не кто написал. Для авторства смотри blame.
- CODEOWNERS не выдаёт права. Если owner не имеет write-доступа к репо, его approve не считается. Сначала выдать доступ (через team или прямой grant), потом CODEOWNERS.
- Без
Require review from Code Ownersв branch protection CODEOWNERS - только подсказка о reviewers, не блокирующая.