Gemini API를 사용하여 AI가 생성한 내용으로 Pull Request를 자동 생성하는 GitHub Action입니다.
- 🤖 AI 기반 PR 생성: Gemini API를 사용하여 PR 제목과 설명 자동 생성
- 🏷️ 자동 라벨링: 브랜치 이름에서 이슈 번호 추출하여 라벨 자동 할당
- 📊 토큰 최적화: 스마트 필터링으로 대규모 diff 효율적 처리
- 🔄 중복 방지: PR 생성 전 이미 존재하는지 확인
name: Auto PR with AI
on:
push:
tags:
- "pr-*"
jobs:
create-pr:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Fetch all branches
run: |
git fetch origin develop
git fetch origin +refs/heads/*:refs/remotes/origin/*
- name: Create PR with AI
uses: datepop/create-pr-with-ai@v1.0.0
with:
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
base_branch: develop| 입력 파라미터 | 설명 | 필수 | 기본값 |
|---|---|---|---|
gemini_api_key |
Gemini API 키 | ✅ | - |
base_branch |
PR의 기본 브랜치 | ❌ | develop |
tag_prefix |
태그 접두사 패턴 | ❌ | pr- |
excluded_branches |
제외할 브랜치 목록 (공백으로 구분) | ❌ | develop main master |
node_version |
Node.js 버전 | ❌ | 20 |
max_total_lines |
전체 diff 최대 라인 수 | ❌ | 10000 |
max_file_lines |
파일당 diff 최대 라인 수 | ❌ | 500 |
prompt_template_path |
프롬프트 템플릿 파일 경로 | ❌ | scripts/pr-prompt.md |
gemini_model |
Gemini 모델 이름 | ❌ | gemini-2.5-flash |
gemini_temperature |
Gemini temperature | ❌ | 0.3 |
gemini_top_k |
Gemini topK | ❌ | 20 |
gemini_top_p |
Gemini topP | ❌ | 0.8 |
gemini_max_output_tokens |
최대 출력 토큰 수 | ❌ | 500000 |
schema_title_description |
제목에 대한 JSON 스키마 설명 | ❌ | (기본값 참고) |
schema_body_description |
본문에 대한 JSON 스키마 설명 | ❌ | (기본값 참고) |
pr_assignees |
PR 담당자 목록 (공백으로 구분, 빈 값 = 태그 푸시한 사용자) | ❌ | '' |
- Google AI Studio에 접속
- "Create API Key" 클릭하여 API 키 생성
- API 키 복사
- 저장소 설정 페이지로 이동
- Settings → Secrets and variables → Actions 클릭
- New repository secret 클릭
- 다음 정보 입력:
- Name:
GEMINI_API_KEY - Secret: Gemini API 키
- Name:
- Add secret 클릭
- Settings → Actions → General 클릭
- "Workflow permissions" 섹션에서:
- ✅ Read and write permissions 선택
- ✅ Allow GitHub Actions to create and approve pull requests 체크
- Save 클릭
자동 라벨링을 사용하려면 이슈 번호 패턴에 맞는 라벨을 생성하세요:
- Issues → Labels 클릭
DPN-316,DPN-317등의 라벨 생성- 또는 타입별 라벨:
feature,bugfix,hotfix
- 또는 타입별 라벨:
- 태그 감지:
pr-*패턴의 태그가 push되면 워크플로우 실행 - 브랜치 추출: 태그가 속한 브랜치 자동 감지
- 중복 확인: 해당 브랜치의 PR이 이미 존재하는지 확인
- Diff 추출: 기본 브랜치와 기능 브랜치 간 변경 사항 추출 및 필터링
- 커밋 수집: 모든 커밋 메시지 수집
- AI 생성: Gemini API로 PR 제목과 설명 생성
- 라벨 추출: 브랜치 이름에서 라벨 추출
- PR 생성: 기본 브랜치로 Pull Request 생성 및 라벨 할당
태그 이름은 지정한 prefix로 시작해야 합니다:
설정한 prefix가 pr-일 때:
- ✅
pr-feature/DPN-316 - ✅
pr-DPN-316 - ✅
pr-bugfix/login-issue - ❌
DPN-316(pr- 접두사 없음) - ❌
feature/DPN-316(pr- 접두사 없음)
브랜치 이름에서 자동으로 라벨이 추출됩니다:
| 브랜치 이름 | 추출되는 라벨 |
|---|---|
feature/DPN-316 |
DPN-316 |
bugfix/DPN-123 |
DPN-123 |
hotfix/DPN-999 |
DPN-999 |
feature/new-feature |
feature |
bugfix/fix-bug |
bugfix |
액션은 토큰 사용을 최적화하기 위해 파일을 필터링합니다:
src/**- 소스 코드public/**- 정적 파일- 설정 파일 (package.json, tsconfig.json 등)
node_modules/- 의존성build/,dist/- 빌드 결과물*.lock- Lock 파일*.log- 로그 파일
- 파일당 diff: 최대 500 라인
- 전체 diff: 최대 10,000 라인
- 제한 초과 시: 파일 목록과 통계만 표시
높은 우선순위 (전체 diff 포함):
*.ts,*.tsx- TypeScript*.js,*.jsx- JavaScript
낮은 우선순위 (요약만):
*.scss,*.css- 스타일*.test.ts,*.spec.ts- 테스트*.json- 설정 파일
확인 사항:
- ✅ 태그 이름이
pr-로 시작하는지 확인 - ✅
GEMINI_API_KEYSecret이 올바르게 설정되었는지 확인 - ✅ 워크플로우 권한이 "Read and write permissions"로 설정되었는지 확인
- ✅ Actions 탭에서 워크플로우 로그 확인
가능한 원인:
- 잘못되었거나 만료된 Gemini API 키
- API 할당량 초과
- Diff가 너무 커서 토큰 한도 초과
해결 방법:
- API 키 재발급 및 Secret 업데이트
- Google AI Studio에서 할당량 확인
- PR은 폴백 내용으로 생성되므로 수동으로 업데이트 가능
원인:
- 저장소에 해당 라벨이 존재하지 않음
해결 방법:
- Issues → Labels에서 라벨 생성
- PR은 정상적으로 생성됨 (라벨만 생략)
name: Auto PR with AI
on:
push:
tags:
- "pr-*"
jobs:
create-pr:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Fetch all branches
run: |
git fetch origin develop
git fetch origin +refs/heads/*:refs/remotes/origin/*
- name: Create PR with AI
uses: datepop/create-pr-with-ai
with:
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
base_branch: develop
tag_prefix: pr-
excluded_branches: develop main master
pr_assignees: "user1 user2"- name: Create PR with AI
uses: datepop/create-pr-with-ai@v1.0.0
with:
gemini_api_key: ${{ secrets.GEMINI_API_KEY }}
gemini_model: gemini-2.5-flash
gemini_temperature: 0.5
gemini_max_output_tokens: 1000000다음과 같은 명령을 수행하여 액션을 trigger할 수 있습니다.
# 1. 브랜치를 원격에 push
git push -u origin feature/my-key
# 2. 태그 생성 및 push
git tag pr-feature/my-key
git push origin pr-feature/my-key
# 3. 로컬 태그 삭제 (선택사항)
git tag -d pr-feature/my-key위의 과정은 헬퍼 스크립트(push-and-pr.sh)를 사용하여 한 줄의 명령으로 축약할 수 있습니다.
PR 생성을 위한 태그 푸시 과정을 간편하게 만들어주는 push-and-pr.sh 스크립트를 제공합니다.
- push-and-pr.sh를 다운로드합니다.
- 터미널에서 실행권한을 부여합니다.
chmod +x {파일경로}/push-and-pr.shpush-and-pr.sh 파일을 작업환경의 root에 다운로드했다면, 아래와 같이 실행할 수 있습니다.
# 현재 브랜치에서 PR 생성
./push-and-pr.sh
# 특정 브랜치를 지정하여 PR 생성
./push-and-pr.sh feature/DPN-316
# 커스텀 태그 접두사 사용
./push-and-pr.sh -p release- feature/new-feature
# 옵션과 브랜치를 함께 사용
./push-and-pr.sh -p deploy- my-branch| 옵션 | 설명 | 기본값 |
|---|---|---|
-p PREFIX |
태그 접두사 설정 | pr- |
-h |
도움말 출력 | - |
BRANCH |
대상 브랜치 (위치 인자) | 현재 브랜치 |
- 브랜치 Push: 지정된 브랜치를 원격 저장소에 push
- 태그 생성:
{prefix}{branch-name}형식으로 로컬 태그 생성 - 태그 Push: 태그를 원격 저장소에 push (GitHub Action 트리거)
- 태그 정리: 로컬 태그 자동 삭제
- 브랜치 복귀: 원래 브랜치로 자동 복귀 (다른 브랜치를 지정한 경우)
참고: 이 스크립트는 선택사항입니다. 수동으로 태그를 생성하고 push해도 동일하게 작동합니다.
스크립트는 Bash 환경에서 실행됩니다. Windows에서는 다음 방법 중 하나를 선택하세요:
Git for Windows를 설치하면 Git Bash가 함께 설치됩니다.
# Git Bash에서 실행
./push-and-pr.sh
./push-and-pr.sh -p release- feature/DPN-316WSL이 설치되어 있다면 Linux 환경에서 실행할 수 있습니다.
# WSL 터미널에서 실행
./push-and-pr.sh혹은 수동으로 태그를 생성할 수 있습니다.
MIT