티스토리 뷰
반응형
OpenAI + GitHub App 연동으로 PR 리뷰 자동화 도우미 만들기
이전 글에서는 GitHub App을 GitHub Marketplace에 등록하는 절차와 심사 체크리스트를 소개했습니다.
이번 글에서는 GitHub App과 OpenAI를 연동하여, 실제로 PR(풀 리퀘스트)을 요약하고 자동으로 리뷰 코멘트를 생성하는 "AI 코드 리뷰 도우미" 기능을 구현해보겠습니다.
✅ 1. 구현 목표
- PR 생성 시 OpenAI가 변경 코드를 요약
- 개선할 부분이 있으면 자동으로 PR에 리뷰 코멘트 등록
- 리뷰어에게 Slack 또는 GitHub 코멘트로 자동 알림
🔧 2. 필요 기술 스택 및 도구
도구 역할
GitHub App | PR 이벤트 수신 및 인증 처리 |
NestJS | Webhook 서버 및 API 구성 |
OpenAI API | PR 요약 및 리뷰 생성 |
GitHub REST API | PR 코멘트 작성 |
dotenv / config | App 정보 및 Secret 관리 |
Axios | 외부 API 호출 (GitHub, OpenAI 등) |
🧩 3. PR 이벤트 흐름도
[PR 생성] → GitHub App Webhook 수신
→ PR Diff 가져오기
→ OpenAI에게 요약 및 리뷰 요청
→ GitHub PR 코멘트 자동 등록
→ 리뷰어 알림 전송 (Slack 등)
✨ 4. OpenAI를 활용한 PR 요약 및 리뷰 생성
🔹 PR 변경 사항 가져오기
const diffUrl = payload.pull_request.diff_url;
const diffData = await axios.get(diffUrl).then(res => res.data);
🔹 GPT 프롬프트 구성 & 호출
반응형
const prompt = `
다음은 GitHub Pull Request의 변경 사항입니다.
${diffData}
변경 내용을 요약해주고, 코드 개선 제안이 있다면 작성해주세요.
가능하면 코드 레벨에서 리뷰를 해주세요.
`;
const response = await openai.chat.completions.create({
model: 'gpt-4',
messages: [{ role: 'user', content: prompt }],
temperature: 0.7,
});
🔹 GPT 응답 예시
📌 요약:
- 로그인 실패 시 사용자에게 명확한 메시지 표시
- 에러 로깅 위치 개선
💡 리뷰 제안:
- 로그인 실패 메시지를 상수로 추출하는 것이 좋음
- 에러 메시지에 사용자 입력값 포함은 피해야 함 (보안)
🖋 5. GitHub PR 코멘트 등록하기
await axios.post(
`https://api.github.com/repos/${owner}/${repo}/issues/${prNumber}/comments`,
{
body: response.choices[0].message.content,
},
{
headers: {
Authorization: `token ${installationAccessToken}`,
Accept: 'application/vnd.github.v3+json',
},
}
);
🔐 6. 인증 로직: GitHub App → Installation Access Token
// 1. JWT 생성
const jwt = sign({
iss: GITHUB_APP_ID,
iat: now,
exp: now + 600,
}, PRIVATE_KEY, { algorithm: 'RS256' });
// 2. Installation Token 발급
const res = await axios.post(
`https://api.github.com/app/installations/${installationId}/access_tokens`,
{},
{ headers: { Authorization: `Bearer ${jwt}` } }
);
const installationAccessToken = res.data.token;
✅ 이 토큰으로 리포지토리에 안전하게 코멘트 작성 가능
💬 7. (선택) Slack 알림 전송 기능
await axios.post(SLACK_WEBHOOK_URL, {
text: `📢 새로운 PR이 생성되고 자동 리뷰가 완료되었습니다: ${prUrl}`,
});
🔄 8. 전체 코드 요약 (핵심 부분)
@Post('webhook')
async handlePullRequest(@Body() payload) {
if (payload.action === 'opened' && payload.pull_request) {
const diffUrl = payload.pull_request.diff_url;
const diff = await axios.get(diffUrl).then(r => r.data);
const gptResponse = await openai.chat.completions.create({ ... });
const accessToken = await this.getInstallationToken(payload.installation.id);
await axios.post(
`https://api.github.com/repos/.../issues/${prNumber}/comments`,
{ body: gptResponse.choices[0].message.content },
{ headers: { Authorization: `token ${accessToken}` } }
);
await slackService.sendMessage(`📘 PR 리뷰 자동화 완료: ${payload.pull_request.html_url}`);
}
}
🚀 9. 확장 아이디어
기능 설명
PR 리뷰 요약 이메일 전송 | 팀원에게 주기적 PR 요약 전송 |
리뷰 난이도 스코어링 | 변경된 LOC, 파일 수 기반 점수화 |
댓글 기반 대화형 AI 리뷰 | 코멘트에 대해 AI가 답변해주는 기능 |
리뷰 결과 저장 → 대시보드 시각화 | 어떤 리뷰 제안이 수용되었는지 추적 |
🔚 10. 마무리 및 다음 글 예고
이번 글에서는 GitHub App + OpenAI를 연동하여 PR 리뷰 자동화 기능을 만드는 방법을 실습 형태로 알아보았습니다.
이제 코드 리뷰 업무의 상당 부분을 AI가 자동화하고, 개발자는 더 중요한 결정에 집중할 수 있습니다.
다음 글에서는
👉 "Slack + GitHub App 완전 자동화 통합: 알림, 리뷰, 배포까지 한 번에"
실전 협업 자동화 예제를 이어갑니다! 🎯
'모음집 > git' 카테고리의 다른 글
팀 협업에서 git rebase 전략을 사용하는 이유와 방법 (0) | 2025.07.08 |
---|---|
Slack + GitHub App 완전 자동화 통합: 알림, 리뷰, 배포까지 한 번에 (0) | 2025.03.26 |
GitHub Marketplace에 GitHub App 등록하기 – 심사 통과를 위한 체크리스트 (0) | 2025.03.25 |
GitHub App을 SaaS 서비스로 배포하기: 설치형 자동화 도구 만들기 (0) | 2025.03.25 |
GitHub App 기반 고급 자동화 기능 개발: AI 응답, 이슈 분류, 멀티 리포지토리 연동 (0) | 2025.03.24 |
※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 개발블로그
- JAX
- PostgreSQL
- nextJS
- llm
- 백엔드개발
- Prisma
- AI챗봇
- SEO 최적화
- kotlin
- 파이썬알고리즘
- fastapi
- 프론트엔드
- NestJS
- flax
- Docker
- 웹개발
- CI/CD
- nodejs
- REACT
- Python
- SEO최적화
- 딥러닝
- seo 최적화 10개
- 프론트엔드면접
- App Router
- gatsbyjs
- Next.js
- rag
- Ktor
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
글 보관함
반응형