프로젝트 소개
Extra CODEOWNERS는 CODEOWNERS 정책에 따라 일상적인 풀 리퀘스트(PR)를 자동 승인하고자 하는 팀을 위한 셀프 호스팅 GitHub App입니다. 이 앱은 인간 CODEOWNER의 승인 또는 명시적으로 등록된 GitHub App의 승인을 수용하는 필수 체크(required check)를 게시합니다. 리포지토리는 적격한 PR 작성자를 해당 체크의 인간 CODEOWNER 증거로 처리하도록 선택할 수 있습니다. 인원과 팀은 GitHub의 표준 CODEOWNERS 파일에 유지되며, 별도의 정책을 통해 어떤 App이 어떤 소유자와 경로를 담당할 수 있는지 정의합니다.
이 프로젝트가 개발된 이유는 GitHub의 'Require review from Code Owners' 규칙이 사람과 팀은 인식하지만 GitHub App이 그들을 대신하는 것은 허용하지 않기 때문입니다. Stampbot과 같은 App이 이미 PR이 일상적이라는 것을 알고 있더라도, GitHub는 여전히 인간 코드 소유자의 승인을 기다립니다. Extra CODEOWNERS는 이 단일 결정을 체크 방식으로 대체합니다. 각으로 구분된 유효 소유자 세트를 개별적으로 평가하며, 소유 경로로 표시된 모든 소유자 세트가 통과해야 합니다. 하나의 PR에서 한 소유자 세트에는 인간 승인을, 다른 세트에는 App 승인을 사용할 수 있습니다. App 승인은 조직이 해당 App ID를 등록하고, 리포지토리가 이를 수용하며, 위임 범위가 변경된 경로와 유효 CODEOWNER를 포함하고, 필요한 레이블이 존재하며, 승인이 현재 PR 헤드에 적용되고, 조직 또는 내장 가드레일에 의해 해당 경로가 인간 전용으로 설정되지 않은 경우에만 유효합니다. 위임된 경로와 위임되지 않은 경로가 섞인 PR은 위임되지 않은 각 소유자 세트에 대해 여전히 인간의 검토가 필요합니다. 유효한 CODEOWNERS 일치 항목이 없는 경로는 코드 소유자 요구 사항을 생성하지 않지만, 일반 승인 횟수 및 기타 규칙은 여전히 적용됩니다.
GitHub는 최소 승인 횟수, 오래된 리뷰 처리, 서명된 커밋, 관련 없는 필수 체크와 같은 일반적인 PR 규칙을 유지합니다. Extra CODEOWNERS는 오직 'Require review from Code Owners'만 대체하도록 설계되었습니다. GitHub의 공개 계약상 제3자 App 리뷰가 일반 승인 최소 횟수에 포함되는지 명시되어 있지 않으므로, 실제 적용 전 폐기 가능한 리포지토리에서 테스트해야 합니다. 최소 승인 횟수가 0이 아닌 경우, Extra CODEOWNERS 체크가 성공하더라도 여전히 인간의 승인이 필요할 수 있습니다. 이 App은 리뷰를 제출하거나, PR을 병합하거나, 다른 App에 권한을 부여하거나, CODEOWNERS 파일을 편집하지 않습니다. GitHub의 증거를 읽고 하나의 Check Run을 게시할 뿐입니다.
이 체크는 리뷰가 아니라 정책 결과로 해석해야 합니다. Extra CODEOWNERS는 GitHub의 체크 영역에 표시되며, 일반 승인 횟수는 리뷰 영역에 표시됩니다. 팀은 필요한 경우 일반적인 최소 리뷰 규칙을 유지해야 합니다. 체크는 비동기적으로 작동합니다. 승인이 취소되거나 변경되면, GitHub가 이벤트를 전달하고 App이 체크를 재설정 및 재평가할 때까지 이전의 성공 상태가 계속 표시될 수 있습니다. 조정(Reconciliation) 프로세스가 누락된 전달 사항을 복구하지만, 즉각적인 취소 메커니즘은 아닙니다. 이러한 오래된 성공 상태의 창(window)을 허용할 수 없는 경계 조건에서는 GitHub의 기본 코드 소유자 규칙을 유지해야 합니다.
위임은 두 가지 정책 범위로 나뉩니다. CODEOWNERS는 각 경로를 소유하는 사람이나 팀을 결정합니다. 조직 정책은 신뢰할 수 있는 App과 App이 담당할 수 없는 경로를 결정합니다. 리포지토리 정책은 해당 리포지토리에서 등록된 어떤 App이 어떤 소유자와 경로를 담당할 수 있는지 결정합니다. 리포지토리 정책은 조직 정책을 좁힐 수는 있지만, App을 새로 등록하거나 조직 가드레일을 약화시킬 수는 없습니다. 리포지토리 정책은 schema_version, enabled, 그리고 app, paths, for_owners, required_labels를 포함하는 delegations로 구성된 TOML 파일입니다. app 값은 조직 정책의 apps 테이블에 있는 별칭(alias)이며, 이 별칭은 App의 불변 숫자 ID, 공개 슬러그(slug), 봇 사용자 ID와 연결됩니다. 예시 정책 파일은 examples/policy에서 제공되며, 설정 가이드에는 두 가지 범위, 경로 매칭, 레이블, 내장 보호 파일 및 보안되지 않은 탈출구(escape hatch)에 대한 내용이 포함되어 있습니다.
로컬 검사를 위해 Bash, Git, mise가 설치된 환경에서 리포지토리를 클론하고 mise trust, mise install, mise run bootstrap, mise run test를 실행하여 깨끗한 체크아웃을 수행할 수 있습니다. README에서는 mise trust 명령이 로컬 신뢰 결정을 기록하므로 실행 전 mise.toml을 읽을 것을 권장합니다. 성공적인 실행은 테스트 스위트 통과로 끝납니다. 이는 GitHub App을 등록하거나 실제 GitHub 계약을 증명하는 것이 아닙니다. 테스트 리포지토리에 체크를 게시하려면 first-check 튜토리얼이 제공됩니다. 중요한 곳에서는 기본 코드 소유자 규칙을 계속 활성화해야 합니다. 알파 이미지와 차트는 섀도 모드 테스트용으로만 제공되며 다이제스트(digest)로 고정해야 합니다.
이 프로젝트는 프리릴리스 상태입니다. 알파 이미지와 차트는 필수 사항이 아닌 섀도 모드 테스트 전용이며 프로덕션 병합을 강제하는 데 사용해서는 안 됩니다. main 및 관련 sha, sha256 태그와 같은 레거시 프리뷰 이미지는 불변 릴리스 파이프라인 이전의 것이므로 지원되지 않으며 배포 시 안전하지 않습니다. 프로젝트 상태 문서에는 현재 사용 가능한 기능과 지원 릴리스를 위해 해결해야 할 사항이 구분되어 있습니다. 문서는 프로젝트 상태, 기본 CODEOWNERS 비교, 위협 모델, 개발 설치 튜토리얼, 설정 가이드, 문제 해결 가이드, 배포 및 운영 가이드, 수신자 통지 번들, 아키텍처 및 유지 관리자 가이드, 기여자 가이드를 포함합니다. 전체 매뉴얼은 Read the Docs에서 확인할 수 있습니다. 프로젝트 정책은 지원, 비공개 취약점 보고, OpenSSL CVE 및 VEX, 거버넌스, 변경 로그, Apache License 2.0을 다룹니다. 배지 세트는 CI, 속성 테스트, 커버리지, CodeQL, OpenSSF Scorecard, 문서화, Python 3.12~3.14 및 Apache-2.0 라이선스를 나타냅니다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.