GitHub Actions에서 주기적으로 실행되는 Kotlin + Spring Boot 배치 앱입니다. 저장소의 open pull request를 조회한 뒤 PR 제목과 변경 파일 경로를 검사하고, 규칙을 만족하면 squash merge합니다. 규칙을 위반하면 PR에 실패 사유 댓글을 남깁니다.
- 현재 코드는 AtCoder-Study 기준으로 만들어졌고, CodeForces-Study 기준에는 맞지 않으니 수정이 필요합니다.
- 최다참여자 선정 기준을 정해야 하고, 그 결과를 표시할 방법도 마련해야 합니다.
| 구분 | 사용 |
|---|---|
| 언어 | |
| 프레임워크 | |
| 기술 스택 | |
| 사용 API |
PR 제목은 다음 형식이어야 합니다.
대회이름 / AtCoder핸들
/ 양쪽 공백은 있어도 되고 없어도 됩니다. AtCoder 핸들은 [A-Za-z0-9_-]+ 형식만 허용합니다.
예:
ABC350 / tourist
ABC350/tourist
ABC350 / tourist_123
변경 파일은 PR 제목에서 파싱한 대회이름과 AtCoder핸들을 사용해 다음 경로 아래에 있어야 합니다.
대회이름/AtCoder핸들/**
예를 들어 PR 제목이 ABC350 / tourist라면 다음 경로는 허용됩니다.
ABC350/tourist/A.kt
ABC350/tourist/src/Main.kt
다음 경로는 허용되지 않습니다.
ABC350/other/A.kt
README.md
| 변수 | 설명 | 기본값 |
|---|---|---|
REPO_OWNER |
검사할 GitHub 저장소 owner 또는 organization | 없음 |
REPO_NAME |
검사할 GitHub 저장소 이름 | 없음 |
GITHUB_TOKEN |
검사할 저장소에 접근 가능한 GitHub API 토큰 | 없음 |
DRY_RUN |
실제 댓글/머지/Discord 전송 없이 로그만 출력 | true |
DISCORD_ENABLED |
Discord webhook 전송 활성화 | false |
DISCORD_WEBHOOK_URL |
Discord webhook URL | 빈 값 |
JDK 21이 필요합니다.
export REPO_OWNER=your-owner
export REPO_NAME=your-repo
export GITHUB_TOKEN=your-token
export DRY_RUN=true
./gradlew bootRunWindows PowerShell에서는 다음처럼 실행할 수 있습니다.
$env:REPO_OWNER="your-owner"
$env:REPO_NAME="your-repo"
$env:GITHUB_TOKEN="your-token"
$env:DRY_RUN="true"
./gradlew bootRun워크플로는 .github/workflows/pr-bot.yml에 있습니다.
- 매주 금요일 19:00 KST 실행
- GitHub Actions cron 기준:
0 10 * * 5 workflow_dispatch로 수동 실행 가능- 수동 실행 시
dry_run,target_owner_1,target_repo_1,target_owner_2,target_repo_2input 지원
봇 레포와 검사할 레포가 달라도 됩니다. 최대 2개 레포까지 순차적으로 검사할 수 있습니다.
봇 레포의 Settings -> Secrets and variables -> Actions -> Variables에 값을 추가합니다.
| 종류 | 이름 | 설명 |
|---|---|---|
| Repository 또는 Organization variable | TARGET_REPO_OWNER_1 |
첫 번째 검사 레포의 owner 또는 organization |
| Repository 또는 Organization variable | TARGET_REPO_NAME_1 |
첫 번째 검사 레포 이름 |
| Repository 또는 Organization variable | TARGET_REPO_OWNER_2 |
두 번째 검사 레포의 owner 또는 organization. 선택 |
| Repository 또는 Organization variable | TARGET_REPO_NAME_2 |
두 번째 검사 레포 이름. 선택 |
| Repository 또는 Organization variable | DISCORD_ENABLED |
Discord 알림 사용 여부. 선택 |
레포를 하나만 검사하려면 TARGET_REPO_OWNER_1, TARGET_REPO_NAME_1만 설정하면 됩니다. 기존 TARGET_REPO_OWNER, TARGET_REPO_NAME도 첫 번째 레포 설정으로 사용할 수 있습니다.
예를 들어 pulse-club/algorithm-study와 pulse-club/coding-test-study를 검사하려면 다음처럼 설정합니다.
TARGET_REPO_OWNER_1=pulse-club
TARGET_REPO_NAME_1=algorithm-study
TARGET_REPO_OWNER_2=pulse-club
TARGET_REPO_NAME_2=coding-test-study
봇 레포의 Settings -> Secrets and variables -> Actions -> Secrets에 값을 추가합니다.
| 종류 | 이름 | 설명 |
|---|---|---|
| Repository secret | BOT_GITHUB_TOKEN |
모든 검사 대상 레포에 접근 가능한 토큰 |
| Repository secret | DISCORD_WEBHOOK_URL |
Discord webhook URL. 선택 |
봇 레포와 검사할 레포가 다르면 기본 secrets.GITHUB_TOKEN으로는 부족합니다. BOT_GITHUB_TOKEN에는 fine-grained PAT 또는 GitHub App 토큰을 넣어야 합니다.
fine-grained PAT를 쓴다면 대상 레포 1개 또는 2개를 선택하고, Repository permissions를 다음처럼 줍니다.
| 권한 | 필요 수준 | 이유 |
|---|---|---|
Contents |
Read and write | 조건을 만족한 PR을 squash merge |
Pull requests |
Read and write | 열린 PR과 변경 파일 조회 |
Issues |
Read and write | 규칙 위반 PR에 댓글 작성 |
수동 실행할 때 target_owner_1, target_repo_1, target_owner_2, target_repo_2를 입력하면 Actions 변수보다 우선합니다.
처음에는 Actions -> PR Guardian Bot -> Run workflow에서 dry_run=true로 실행해 로그만 확인합니다. 문제가 없으면 dry_run=false로 다시 실행합니다.
스케줄 실행은 dry_run=false로 동작합니다. 실제 댓글 작성, squash merge, Discord 전송이 수행될 수 있으므로 토큰과 대상 레포를 먼저 확인해야 합니다.
DRY_RUN=true이면 실제 side effect를 수행하지 않습니다.
- PR 댓글 작성 안 함
- PR merge 안 함
- Discord webhook 전송 안 함
대신 로그에 Would comment, Would merge, Would send Discord notification 형태로 출력합니다. 기본값은 true입니다.
Discord 알림은 선택 기능입니다. DISCORD_ENABLED=true이고 DISCORD_WEBHOOK_URL 값이 있을 때만 invalid PR 요약을 전송합니다. DRY_RUN=true이면 전송하지 않고 로그만 출력합니다.
Copilot automatic code review는 GitHub 저장소 설정에서 별도로 활성화해야 합니다. 이 봇은 Copilot 리뷰 결과를 직접 처리하지 않고, PR 제목/파일 경로 검증과 댓글/merge 처리만 담당합니다.