티스토리 뷰

반응형

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 완전 자동화 통합: 알림, 리뷰, 배포까지 한 번에"
실전 협업 자동화 예제를 이어갑니다! 🎯

 

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
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
글 보관함
반응형