TL;DR: GitPulse β ΡΡΠΎ AI-Π°Π³Π΅Π½Ρ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° merge requests Π² GitLab, ΡΠΎΡΠ΅ΡΠ°ΡΡΠΈΠΉ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΈ AI-ΠΌΠΎΠ΄Π΅Π»ΠΈ (Gemini ΠΈ Ollama). ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, ΠΎΡΠ΅Π½ΠΊΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ΄Π° ΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΡΠ°Π±ΠΎΡΠΈΠΌΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ.
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ ΠΈ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ
Code review β ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² Π² ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΠ, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡΠΈΠΉ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°ΡΡΠΈΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ Π² ΡΠ΅Π°Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°Ρ ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ°ΡΡΠΎ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΡΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ: ΠΏΡΠΎΠΏΡΡΠ΅Π½Π½ΡΠ΅ security issues, Π½Π΅ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΡ review, ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠ΅ feedback cycles, ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠΈΠ΅ΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π° ΡΠΈΠΏΠΈΡΠ½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ.
GitPulse ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΈ AI-ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π»Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π°. ΠΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΊΠΎΡΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ, Π½ΠΎ ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ.
ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ°ΡΡΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ ΠΊΠΎΠ΄Π°
ΠΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° GitPulse
GitPulse ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° Π½Π° React ΠΈ Π±ΡΠΊΠ΅Π½Π΄Π° Π½Π° NestJS. ΠΠ»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ MongoDB, Π° Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ GitLab β WebSockets ΠΈ REST API.
// ΠΡΠΈΠΌΠ΅Ρ ΡΡΡΡΠΊΡΡΡΡ ΠΏΡΠΎΠ΅ΠΊΡΠ°
// server/
// src/
// app.module.ts
// review/
// review.module.ts
// review.service.ts
// client/
// src/
// App.tsx
// components/
// ReviewComponent.tsx
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ GitLab
ΠΠ»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Ρ GitLab ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Webhooks. ΠΠΎΠ³Π΄Π° ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΉ merge request, GitPulse Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π°Π½Π°Π»ΠΈΠ·Π°.
// ΠΡΠΈΠΌΠ΅Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ webhook Π² NestJS
@Post('webhook')
async handleWebhook(@Body() payload: any) {
const eventType = payload.object_kind;
if (eventType === 'merge_request') {
this.reviewService.startReview(payload);
}
}
Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·
ΠΠ΅ΡΠ΅Π΄ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ ΠΊΠΎΠ΄Π° AI-ΠΌΠΎΠ΄Π΅Π»ΠΈ GitPulse Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠΈΠΏΠΈΡΠ½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ.
// ΠΡΠΈΠΌΠ΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°
function performStaticAnalysis(code: string): string[] {
const issues: string[] = [];
const consoleLogRegex = /console\.log\(.*\);/g;
if (consoleLogRegex.test(code)) {
issues.push('Avoid using console.log in production code');
}
return issues;
}
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ AI-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ
GitPulse ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ AI-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ, Π²ΠΊΠ»ΡΡΠ°Ρ Google Gemini ΠΈ Ollama (Π΄Π»Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ LLM). ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π³ΠΈΠ±ΠΊΠΎ Π²ΡΠ±ΠΈΡΠ°ΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
// ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Gemini API
async function analyzeWithGemini(code: string): Promise<string> {
const geminiResponse = await geminiClient.generateContent({
model: 'gemini-2.0-flash',
prompt: `Review this code: ${code}`,
});
return geminiResponse.text();
}
ΠΡΠ΅Π½ΠΊΠ° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΊΠΎΠ΄Π°
ΠΠ°ΠΆΠ΄ΡΠΉ merge request ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠ΅Π½ΠΊΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΎΡ 0 Π΄ΠΎ 100 ΠΈ Π±ΡΠΊΠ²Π΅Π½Π½ΡΠΉ ΡΠ΅ΠΉΡΠΈΠ½Π³ (A-F). ΠΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ Π±ΡΡΡΡΠΎ ΠΎΡΠ΅Π½ΠΈΡΡ ΠΎΠ±ΡΠ΅Π΅ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ΄Π°.
// ΠΡΠΈΠΌΠ΅Ρ ΡΠ°ΡΡΠ΅ΡΠ° ΠΎΡΠ΅Π½ΠΊΠΈ
function calculateQualityScore(issues: string[]): number {
const totalIssues = issues.length;
return totalIssues > 0 ? Math.max(0, 100 - totalIssues * 10) : 100;
}
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅
GitPulse ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅ΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ Π² ΡΠ°Π±ΠΎΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ GitLab, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°ΠΌ ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΡΠ΅ feedback loops. ΠΡΠΎ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ Ρ Π²ΡΡΠΎΠΊΠΈΠΌ ΡΠ΅ΠΌΠΏΠΎΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π³Π΄Π΅ Π²Π°ΠΆΠ½ΠΎ Π±ΡΡΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠ΅Π²ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
- Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠ·Π΄Π°Π΅Ρ merge request.
- GitPulse Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΊΠΎΠ΄ ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅Ρ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.
- Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠ΅Π½ΠΊΡ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΈ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°ΡΠΈΠΈ ΠΏΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ.
- ΠΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅ΡΡΡ Π΄ΠΎ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
GitPulse β ΠΌΠΎΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ code review, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΡΠ΅ΡΠ°Π΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· ΠΈ AI-ΠΌΠΎΠ΄Π΅Π»ΠΈ Π΄Π»Ρ Π³Π»ΡΠ±ΠΎΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΊΠΎΠ΄Π°. ΠΠ½ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΊΠΎΡΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ, Π½ΠΎ ΠΈ Π΄Π΅Π»Π°Π΅Ρ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΡΠΌ. ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ GitLab ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ AI-ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ Π³ΠΈΠ±ΠΊΠΈΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π΄Π»Ρ ΠΊΠΎΠΌΠ°Π½Π΄ Π»ΡΠ±ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ GitPulse Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅, ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° GitHub: GitPulse-AIAgent. ΠΠ°ΡΠΈ feedback ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ!
ΠΡΡΠΎΡΠ½ΠΈΠΊ: https://dev.to/pandi2352/gitpulse-ai-powered-gitlab-code-review-agent-gemini-ollama-p8o