반응형
“PR 설명 좀 제대로 써주세요…”
반복되는 잔소리를 끝내고, AI가 코드 diff를 읽어 PR 템플릿을 자동으로 메워주는 워크플로를 구축한 과정을 정리했다. 그대로 가져다 써도 되고, 팀 상황에 맞게 변형만 해도 된다.
- GitHub Action이 PR diff를 수집
- diff를 OpenAI API로 전송 → 시스템 프롬프트로 요약 포맷 강제
- 응답을 PR 본문에 삽입
- 결과 미흡하면 프롬프트만 조정
1. 배경 - 왜 자동화?
- 코드 변경량이 커질수록 설명은 더 조잡해졌다.
- “주요 기능 몇 개만 요약해줘”라는 리뷰어 요청이 반복.
- ChatGPT를 수동으로 돌리니 → 답변 패턴이 들쭉날쭉.
그래서 아예 PR 생성 트리거로 AI 요약을 강제했다.
2. 시퀀스 다이어그램
3. GitHub Action 코드
name: Auto-fill PR Template
on:
pull_request:
types: [opened]
branches: [main, feature]
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
jobs:
auto-fill-template:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
- name: Get diff
run: |
git diff ${{ github.event.pull_request.base.sha }} \
${{ github.event.pull_request.head.sha }} > diff_raw.txt
# 50KB 초과 시 truncate
[ $(wc -c < diff_raw.txt) -gt 50000 ] && \
{ head -n 1000 diff_raw.txt; echo "\n[...truncated...]"; } \
> diff_raw.txt.tmp && mv diff_raw.txt.tmp diff_raw.txt
echo "diff_base64=$(base64 -w0 diff_raw.txt)" >> $GITHUB_OUTPUT
- name: Ask OpenAI
run: |
jq -n \
--arg sys "${SYSTEM_PROMPT}" \
--arg diff "$(base64 -d <<< ${{ steps.get-diff.outputs.diff_base64 }})" \
'{
model:"gpt-4o-mini",
messages:[
{role:"system", content:$sys},
{role:"user", content:("```diff\n"+$diff+"\n```")}
],
max_tokens:1500, temperature:0.3
}' > req.json
RESULT=$(curl -s -H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d @req.json https://api.openai.com/v1/chat/completions)
echo "summary=$(jq -r '.choices[0].message.content' <<< $RESULT)" >> $GITHUB_OUTPUT
- name: Update PR body
uses: actions/github-script@v7
env: { AI_SUMMARY: ${{ steps.ask-openai.outputs.summary }} }
with: |
const body = `
## 📸 작동 사진/영상
## 📝 주요 변경 사항
${process.env.AI_SUMMARY}
## 🔗 참고 링크
## 💬 리뷰어에게
`;
await github.rest.pulls.update({
...context.repo,
pull_number: context.payload.pull_request.number,
body
});
4. 시스템 프롬프트 설계
4.1 원칙 7가지
- 역할 명확화
“당신은 Django Backend 전문가…” - 산출 형식 고정
PR 템플릿 헤더·이모지까지 강제 - 분량 제한
핵심 기능은 2~4줄, 한 문장 요약 - 구체 기술 키워드
“select_related, bulk_create” 등 - 변경 없는 항목 작성 금지
쓸데없는 목차 비우기 - 언어와 톤 고정
전부 한국어, 존댓말/반말 통일 - 토큰 초과 대비
50KB 이상 diff는 truncate
4.2 골격 예시
당신은 ‘Django 서버리스 API’ 의 git diff를 분석하는 전문가다.
아래 템플릿 헤더·이모지·형식을 **절대 변경하지 말고** 채워라.
조건:
1) 핵심 기능 2~4개, 한줄 요약
2) 변경 없는 항목은 작성 금지
3) 모든 내용 한국어, 기술 키워드 구체화
---
### 🎯 핵심 기능
- ...
### 🔧 구현된 기능들
#### 1. **[기능 명칭]**
- ...
### 🗂️ 파일 구조
- ...
### ⚡ 성능 최적화
- ...
프로젝트 소개 부분(Django ...
)만 바꿔 끼우면 다른 레포에서도 그대로 쓸 수 있다.
5. 스택별 체크리스트 (예시)
스택 | 요약 시 강조 포인트 |
---|---|
Django/DRF | 모델 필드 추가, 시리얼라이저 변경, select_related |
FastAPI | Router 경로, Pydantic 스키마 수정, BackgroundTasks |
React/Next.js | 페이지 경로, Zustand/Recoil 상태 변화, tree-shaking |
Terraform | 리소스 증감, 모듈 버전 업, 비용 영향 |
6. 비용 & 보안
gpt-4o-mini
→ 토큰 대비 성능/가격 균형- Org-level secret으로 API Key 관리
- 로그에 diff 직접 노출 X (base64 처리)
- 실패 시 “AI 분석 실패” 플레이스홀더 삽입
7. 적용 절차
- PR 템플릿 준비 → 핵심 섹션 정의
- 시스템 프롬프트 골격 복붙 후 프로젝트 소개만 교체
- Action YAML 붙여넣고 Secret 등록
- 더미 PR 올려 결과 확인 → 프롬프트 튜닝
- 팀 공유 & 룰 고지
8. 결과
9. 마치며
PR 자동 완성은 프롬프트 설계만 잘하면 금방 붙일 수 있다.
역할 고정 + 형식 강제 + 토큰 절약—이 세 가지만 기억하자.
이제 “주요 변경 사항 뭐죠?”라는 말은 AI에게 맡기고, 우리는 코드 품질 개선에 집중하면 된다.
그래도 너무 자동으로 써준 내용에 신뢰하지 않도록 한다. 만들어낸 결과를 가지고 불필요한 부분은 과감하게 지우고 강조하고 싶은 내용만 다시 작성하는 작업은 필수적이라고 생각한다.
반응형