@@ -3,59 +3,110 @@ name: Gemini Automated Code Review
33on :
44 pull_request :
55 types : [opened, reopened, synchronize]
6- workflow_dispatch :
7- inputs :
8- pr_number :
9- description : " 리뷰할 PR 번호를 입력하세요 (예: 123) "
10- required : true
11- type : number
6+ branches :
7+ - main
8+
9+ permissions :
10+ pull-requests : write
11+ contents : read
1212
1313jobs :
14- gemini_code_review :
14+ code_review :
1515 runs-on : ubuntu-latest
16- permissions :
17- pull-requests : write
18- contents : read
1916
2017 steps :
21- - name : Checkout Code
18+ - name : Checkout repository
2219 uses : actions/checkout@v4
23- with :
24- fetch-depth : 0
2520
26- - name : Run Gemini Reviewer (Auto)
27- if : github.event_name == 'pull_request'
28- uses : truongnh1992/gemini-ai-code-reviewer@v9.1.0
21+ - name : Set up Node.js
22+ uses : actions/setup-node@v4
2923 with :
30- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
31- GEMINI_API_KEY : ${{ secrets.GEMINI_API_KEY }}
32- GEMINI_MODEL : " gemini-2.0-flash-exp"
24+ node-version : 20
25+
26+ - name : Install Google Gemini CLI
27+ run : npm install -g @google/generative-ai-cli
28+
29+ - name : Generate Git Diff for PR
30+ run : |
31+ git fetch origin "${{ github.event.pull_request.base.ref }}"
32+ git fetch origin "${{ github.event.pull_request.head.ref }}"
33+ git diff "origin/${{ github.event.pull_request.base.ref }}"..."origin/${{ github.event.pull_request.head.ref }}" > diff.txt
34+ echo "✅ Diff generated:"
35+ head -n 20 diff.txt || true
36+
37+ - name : Run Gemini Review
38+ id : gemini_review
39+ uses : actions/github-script@v7
3340 env :
34- EXTRA_PROMPT : |
35- 당신은 시니어 프론트엔드 개발자입니다. 아래 코드 변경 사항을 면밀히 검토하고
36- 1. 잠재적인 버그나 로직 오류
37- 2. 성능 저하를 유발하는 부분
38- 3. 타입스크립트 문법 오류 및 보완점
39- 4. 한국어 주석과 변수명 스타일에 대한 지적
40- 5. 중복되는 코드 및 하드 코딩된 부분
41- 6. 최소 5개에서 10개 이하의 리뷰
42- 에 초점을 맞춰 구체적인 제안과 함께 리뷰를 작성해주세요. 리뷰는 **파일별**로 간결하고 건설적이어야 합니다.
43-
44- - name : Run Gemini Reviewer (Manual)
45- if : github.event_name == 'workflow_dispatch'
46- uses : truongnh1992/gemini-ai-code-reviewer@v9.1.0
47- with :
48- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
4941 GEMINI_API_KEY : ${{ secrets.GEMINI_API_KEY }}
50- GEMINI_MODEL : " gemini-2.0-flash-exp"
51- env :
52- PULL_REQUEST_NUMBER : ${{ github.event.inputs.pr_number }}
53- EXTRA_PROMPT : |
54- 당신은 시니어 프론트엔드 개발자입니다. 아래 코드 변경 사항을 면밀히 검토하고
42+ with :
43+ script : |
44+ const fs = require("fs");
45+ const diff_output = fs.readFileSync("diff.txt", "utf8");
46+
47+ if (!diff_output.trim()) {
48+ console.log("No code changes detected, skipping review.");
49+ fs.writeFileSync("review_result.txt", "변경된 코드가 없어 리뷰를 건너뜁니다.");
50+ return;
51+ }
52+
53+ const { GoogleGenerativeAI } = require("@google/generative-ai");
54+ const genAI = new GoogleGenerativeAI(process.env.GEMINI_API_KEY);
55+ const model = genAI.getGenerativeModel({ model: "gemini-2.0-flash-exp" });
56+
57+ const prompt = `
58+ 당신은 **시니어 프론트엔드 개발자**입니다.
59+
60+ 다음은 Pull Request의 git diff 내용입니다.
61+ 각 파일의 변경사항을 면밀히 검토하고 아래 항목 중심으로 리뷰를 작성하세요.
62+
5563 1. 잠재적인 버그나 로직 오류
56- 2. 성능 저하를 유발하는 부분
57- 3. 타입스크립트 문법 오류 및 보완점
58- 4. 한국어 주석과 변수명 스타일에 대한 지적
59- 5. 중복되는 코드 및 하드 코딩된 부분
60- 6. 최소 5개에서 10개 이하의 리뷰
61- 에 초점을 맞춰 구체적인 제안과 함께 리뷰를 작성해주세요. 리뷰는 **파일별**로 간결하고 건설적이어야 합니다.
64+ 2. 성능 저하를 유발할 수 있는 부분
65+ 3. 타입스크립트 문법 / 타입 오류 및 개선점
66+ 4. 변수명, 함수명, 주석 스타일 관련 개선점
67+ 5. 중복 코드, 하드코딩된 값, 리팩토링 포인트
68+ 6. 전반적인 코드 품질 및 가독성
69+ 7. 구체적이고 건설적인 개선 제안 (최소 5개 이상)
70+
71+ **출력 형식 요구사항**
72+ - 한국어로 작성
73+ - 파일별 섹션 구분 (예: ### src/components/Button.tsx)
74+ - 마크다운 형식 사용
75+ - 불필요한 서론/결론 없이 리뷰 내용만 출력
76+
77+ 아래는 변경된 코드입니다:
78+
79+ <git diff>
80+ ${diff_output}
81+ </git diff>
82+ `;
83+
84+ console.log("🤖 Gemini에게 코드 리뷰 요청 중...");
85+
86+ const result = await model.generateContent(prompt);
87+ const text = result.response.text();
88+
89+ fs.writeFileSync("review_result.txt", text);
90+ console.log("✅ Gemini 리뷰 결과 저장 완료");
91+
92+ - name : Comment on Pull Request
93+ uses : actions/github-script@v7
94+ with :
95+ script : |
96+ const fs = require("fs");
97+ const review = fs.readFileSync("review_result.txt", "utf8");
98+
99+ const pr_number = context.payload.pull_request.number;
100+ const owner = context.repo.owner;
101+ const repo = context.repo.repo;
102+
103+ console.log(`🗣️ Posting Gemini review to PR #${pr_number}`);
104+
105+ await github.rest.issues.createComment({
106+ owner,
107+ repo,
108+ issue_number: pr_number,
109+ body: `## 🤖 Gemini 코드리뷰 결과\n${review}`
110+ });
111+
112+ console.log("✅ Gemini 리뷰 코멘트 작성 완료");
0 commit comments