설계 판단
- 그룹 웹훅 1개로 저장소 10개를 커버해 관리 지점을 하나로 줄임
- 웹훅 URL이 노출돼도 LLM 비용이 새지 않게 시크릿 토큰 검증을 맨 앞에 배치
- diff가 12,000자를 넘으면 잘라서 토큰 비용 폭증을 막음
- 자동 리뷰는 MR이 열릴 때 1번만, 이후는 /review 댓글로 다시 요청 — push마다 코멘트가 쌓이는 걸 막으려고 update 이벤트는 일부러 제외
Merge Request가 열리면
10~20초 안에 첫 리뷰가 달려요.
교육생이 GitLab에 Merge Request를 올리면 n8n AI Agent가 diff를 읽고 리뷰 코멘트를 남긴 뒤 Mattermost로 알려주는 자동화예요. 반복되는 1차 리뷰는 봇이 맡고, 코치는 설계와 구조 피드백에 시간을 쓰도록 만들었어요.
코치가 교육생 MR을 하나하나 확인하고 코멘트를 다는 데 시간이 많이 들었어요. 리뷰가 늦어지면 교육생은 피드백을 기다려야 했고, 인원에 비해 시간이 부족해 사소한 실수까지 짚어주기는 어려웠어요.
저장소가 비공개라, 운영 중인 워크플로 파일(n8n-workflow.json)에서 구조와 판단이 담긴 부분만 옮겼어요. 비밀값은 원본에도 자리표시값으로 되어 있어요.
GitLab 웹훅 하나로 받아서, 코드로 거르고, AI Agent가 리뷰한 뒤 두 곳에 남겨요.
Filter & Prepare 노드 발췌
const CONFIG = { maxDiffChars: 12000, triggerActions: ['open'], // 처음 열릴 때만 자동 리뷰 triggerKeyword: '/review', // 댓글로 재리뷰 }; // 1) 시크릿 토큰부터 검증 if (headers['x-gitlab-token'] !== CONFIG.webhookSecret) return []; // 2-A) MR 이벤트: open이 아니면 무시 if (!CONFIG.triggerActions.includes(attrs.action)) return []; // 2-B) 댓글 이벤트: 정확히 '/review'일 때만 if (note.trim() !== CONFIG.triggerKeyword) return [];
AI Agent 시스템 메시지 발췌
정말 중요한 이슈 2~3개만 선별해서 코멘트하세요.
사소한 트집을 다 나열하지 마세요.
마지막은 다른 팀원도 논의에 참여할 수 있는
열린 질문 하나로 마무리하세요.
"이 리뷰는 참고용으로 활용하시고 반드시
직접 검증해 보셔야 합니다!" 문구를 포함하세요.
// 메모리를 쓰는 만큼 넣어 둔 규칙
이전 답변 기록이 없다면 "이전 리뷰에서" 같은
표현을 단 한 글자도 지어내지 마세요.처음엔 Redis 조회·저장과 '이전 리뷰 내용'을 프롬프트에 끼워 넣는 로직을 n8n Code 노드로 직접 짰어요.
다시 보니 부족한 건 기능이 아니었어요. 대화 기록 관리를 제가 짠 코드가 전부 떠안고 있어서, 고칠 곳이 계속 늘어나는 구조였어요.
n8n AI Agent 노드에 Chat Model(Groq)과 Memory(Redis)를 서브노드로 붙여 기록 관리를 맡겼고, 직접 짠 Code 로직을 줄였어요.
같은 구조에 GitLab Discussion API를 Tool로 붙이면 줄 단위 리뷰로도 넓힐 수 있게 됐어요.