-
Notifications
You must be signed in to change notification settings - Fork 0
148 lines (120 loc) · 6.05 KB
/
code-review.yml
File metadata and controls
148 lines (120 loc) · 6.05 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
name: Code Review with GPT
on:
pull_request:
types: [opened, synchronize]
workflow_dispatch:
jobs:
code_review:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
pip install openai requests
- name: Generate diff for code review
id: diff
run: |
git fetch origin ${{ github.event.pull_request.base.ref }} --depth=1
git diff origin/${{ github.event.pull_request.base.ref }} ${{ github.sha }} > pr_diff.txt
shell: bash
- name: Perform Code Review with GPT and Comment on Changed Lines
id: gpt_review
run: |
python <<EOF
import openai
import requests
import json
# OpenAI API Key 설정
openai.api_key = "${{ secrets.OPENAI_API_KEY }}"
# 시스템 프롬프트 및 모델명 가져오기
system_prompt = """${{ secrets.SYSTEM_PROMPT }}"""
model_name = "${{ secrets.OPENAI_MODEL }}"
# 처리된 파일과 라인 기록 (중복 방지)
processed_files = set() # 각 파일을 기록
processed_lines = {} # 각 파일별로 라인을 기록하기 위한 딕셔너리로 수정
# GitHub API 호출 로그
print("Fetching changed files from GitHub API...")
# 변경된 파일과 라인 정보를 가져오기 위한 GitHub API 호출
files_url = f"https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/files"
headers = {"Authorization": f"token ${{ secrets.GITHUB_TOKEN }}"}
try:
response = requests.get(files_url, headers=headers, timeout=10)
print(f"GitHub API status code: {response.status_code}") # 상태 코드 로그 출력
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"Error fetching files: {e}")
exit(1)
if response.status_code == 200:
print("Files fetched successfully. Analyzing changes...")
files_changed = response.json()
# .java 파일만 필터링
java_files = [file for file in files_changed if file['filename'].endswith('.java')]
if not java_files:
print("No .java files to review.")
exit(0)
for file in java_files:
file_path = file['filename']
# 이미 처리한 파일은 건너뛰기
if file_path in processed_files:
print(f"Skipping already processed file: {file_path}")
continue
print(f"Processing file: {file_path}")
patch = file.get('patch', '')
print(f"Analyzing patch for file: {file_path}")
# 각 파일마다 중복 라인 처리를 위한 집합 생성
if file_path not in processed_lines:
processed_lines[file_path] = set()
# 전체 패치 내용을 GPT에게 전달
if patch: # 패치가 존재할 경우에만 처리
print(f"Calling GPT API for patch in file: {file_path}")
try:
gpt_response = openai.chat.completions.create(
model=model_name,
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": f"Here is the code diff for context:\n{patch}"}
],
timeout=30
)
except Exception as e:
print(f"Error in GPT request: {e}")
continue
review_comment = gpt_response.choices[0].message.content
print(f"GPT response received for file: {file_path}")
print(f"Review comment: {review_comment}")
# 변경된 파일과 라인에 리뷰 코멘트를 추가
commit_id = "${{ github.event.pull_request.head.sha }}"
line_number = file.get('patch').split('\n').index(next(line for line in file['patch'].split('\n') if line.startswith('+'))) + 1
comment_body = {
"body": review_comment,
"path": file_path,
"line": line_number,
"side": "RIGHT",
"commit_id": commit_id
}
# 코멘트를 추가하기 전 파일 경로와 위치를 로그로 출력
print(f"Commenting on file: {file_path}, line: {line_number}")
comment_url = f"https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.pull_request.number }}/comments"
response = requests.post(comment_url, headers=headers, data=json.dumps(comment_body))
# 응답 상태 확인
if response.status_code == 201:
print(f"Comment posted successfully for file: {file_path}")
else:
print(f"Failed to post comment. Status code: {response.status_code}, Response: {response.text}")
# 각 파일을 처리한 후 파일 이름을 기록
processed_files.add(file_path)
else:
print(f"Unexpected status code: {response.status_code}")
exit(1)
# 최종 리뷰 요약 코멘트 추가
final_comment = "### 최종 리뷰 요약: .java 파일에 대한 모든 변경 사항을 검토 완료했습니다."
comment_url = f"https://api.github.com/repos/${{ github.repository }}/issues/${{ github.event.pull_request.number }}/comments"
requests.post(comment_url, headers=headers, data=json.dumps({"body": final_comment}))
print("Final review comment posted.")
exit(0)
EOF