GitLab¶
Detaljan vodič za integraciju sa GitLab CI.
Tokeni¶
Personal Access Token (PAT)¶
Preporučeno za sve GitLab planove (uključujući Free).
CI_JOB_TOKEN ne radi
GitLab-ov automatski CI_JOB_TOKEN ne može postavljati komentare na Merge Request-e
(Notes API zahtijeva api scope, koji CI_JOB_TOKEN nema).
Morate koristiti Personal Access Token ili Project Access Token.
Kako kreirati:
- Idite na User Settings → Access Tokens → Add new token
- URL:
https://gitlab.com/-/user_settings/personal_access_tokens
- URL:
- Popunite polja:
- Token name:
ai-code-reviewer - Expiration date: podesite prema potrebi (npr. 1 godina)
- Scopes: označite
api
- Token name:
- Kliknite Create personal access token
- Kopirajte token odmah — GitLab ga prikazuje samo jednom!
Kako koristiti u CI-ju:
- Idite na Settings → CI/CD → Variables → Add variable
-
Dodajte varijablu:
- Key:
AI_REVIEWER_GITLAB_TOKEN - Value: nalijepite vaš token
- Flags: označite Masked,
odznačite Protected
Varijabla je automatski dostupna svim job-ovima — nije potreban YAML
variables:mapping. - Key:
Odznačite «Protected»!
Podrazumijevano, GitLab označava nove varijable kao Protected. Protected varijable su dostupne samo u zaštićenim granama (npr. main).
MR pipeline-i se pokreću na nezaštićenim izvornim granama — varijabla će biti prazna i dobićete 401 Unauthorized.
Uvijek odznačite «Protected» za AI_REVIEWER_GITLAB_TOKEN i AI_REVIEWER_GOOGLE_API_KEY.
Sačuvajte token
GitLab prikazuje token samo jednom. Sačuvajte ga odmah na sigurnom mjestu.
Project Access Token ( Premium/Ultimate)¶
Dostupan samo na GitLab Premium i Ultimate planovima. Dobar izbor ako preferirate token ograničen na projekat umjesto ličnog.
Prednosti u odnosu na PAT:
- Ograničen na jedan projekat (nema pristupa drugim projektima)
- Može ga opozvati maintainer projekta (nema zavisnosti od konkretnog korisnika)
- Bolji za timove — nije vezan za lični nalog
Kako kreirati:
- Idite na Project → Settings → Access Tokens
- URL:
https://gitlab.com/<owner>/<repo>/-/settings/access_tokens
- URL:
- Popunite polja:
- Token name:
ai-code-reviewer - Role:
Developer(minimalno potreban) - Scopes: označite
api
- Token name:
- Kliknite Create project access token
- Kopirajte token odmah
Kako koristiti u CI-ju:
Isto kao PAT — dodajte kao AI_REVIEWER_GITLAB_TOKEN u CI/CD Variables:
- Key:
AI_REVIEWER_GITLAB_TOKEN - Value: nalijepite vaš Project Access Token
Koji token odabrati?
| Personal Access Token | Project Access Token | |
|---|---|---|
| Plan | Svi (uključujući Free) | Samo Premium/Ultimate |
| Podešavanje | Ručno | Ručno |
| Opseg | Svi projekti korisnika | Jedan projekat |
| Inline komentari | ||
| Najbolje za | Free plan + pune funkcije | Timovi na Premium/Ultimate |
CI/CD varijable¶
Dodavanje varijabli¶
Settings → CI/CD → Variables → Add variable
| Varijabla | Vrijednost | Opcije |
|---|---|---|
AI_REVIEWER_GOOGLE_API_KEY |
Gemini API ključ | |
AI_REVIEWER_GITLAB_TOKEN |
Personal Access Token (scope: api) |
Masked
Uvijek omogućite Masked za tajne — neće se prikazivati u logovima.
Triggeri¶
Preporučeni trigger¶
Ovo pokreće job samo za Merge Request pipeline-e.
Alternativni trigger (only/except)¶
rules vs only
rules — novija sintaksa, preporučena od strane GitLab-a.
Primjeri job-a¶
Minimalni¶
ai-review:
image: ghcr.io/konstziv/ai-code-reviewer:1
script:
- ai-review
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
CI/CD varijable AI_REVIEWER_GOOGLE_API_KEY i AI_REVIEWER_GITLAB_TOKEN se nasljeđuju automatski.
Puni (preporučeno)¶
ai-review:
image: ghcr.io/konstziv/ai-code-reviewer:1
stage: test
script:
- ai-review
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
allow_failure: true
timeout: 10m
variables:
AI_REVIEWER_LANGUAGE: uk
AI_REVIEWER_LANGUAGE_MODE: adaptive
interruptible: true
Šta radi:
allow_failure: true— MR nije blokiran ako revizija ne uspijetimeout: 10m— maksimalno 10 minutainterruptible: true— može se otkazati na novi commit
Sa prilagođenom fazom¶
stages:
- test
- review
- deploy
ai-review:
stage: review
image: ghcr.io/konstziv/ai-code-reviewer:1
script:
- ai-review
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
needs: [] # Ne čeka prethodne faze
Self-hosted GitLab¶
Konfiguracija¶
Docker registar¶
Ako vaš GitLab nema pristup ghcr.io, kreirajte mirror:
# Na mašini sa pristupom
docker pull ghcr.io/konstziv/ai-code-reviewer:1
docker tag ghcr.io/konstziv/ai-code-reviewer:1 \
gitlab.mycompany.com:5050/devops/ai-code-reviewer:latest
docker push gitlab.mycompany.com:5050/devops/ai-code-reviewer:latest
GitLab CI varijable¶
AI Code Reviewer automatski koristi:
| Varijabla | Opis |
|---|---|
CI_PROJECT_PATH |
owner/repo |
CI_MERGE_REQUEST_IID |
Broj MR-a |
CI_SERVER_URL |
GitLab URL |
Ne morate proslijeđivati --repo i --pr — uzimaju se iz CI-ja automatski.
Konfiguracija putem CI/CD varijabli¶
Koristite CI/CD Variables za prebacivanje između LLM provajdera i modela bez mijenjanja .gitlab-ci.yml. Ovo je korisno za poređenje kvaliteta revizije različitih modela na istom MR-u.
Podešavanje¶
CI/CD Variables (Settings → CI/CD → Variables):
| Varijabla | Opis | Opcije |
|---|---|---|
AI_REVIEWER_GOOGLE_API_KEY |
Gemini API ključ | |
AI_REVIEWER_MISTRAL_API_KEY |
Mistral API ključ | |
AI_REVIEWER_GITLAB_TOKEN |
GitLab token | |
AI_REVIEWER_LLM_PROVIDER |
Primarni provajder (google, mistral) |
|
AI_REVIEWER_LLM_FALLBACK_PROVIDER |
Fallback provajder | |
AI_REVIEWER_MISTRAL_MODEL |
Mistral model | |
AI_REVIEWER_MISTRAL_API_URL |
Prilagođeni URL API-ja (za Codestral free tier) |
Konfiguracija job-a¶
ai-review:
image: ghcr.io/konstziv/ai-code-reviewer:1
stage: review
script:
- ai-review
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
allow_failure: true
interruptible: true
Sekcija variables: nije potrebna — sve AI_REVIEWER_* CI/CD varijable se nasljeđuju automatski.
Prebacivanje preseta¶
Promijenite CI/CD Variables u GitLab interfejsu i kliknite Retry na pipeline istog MR-a:
| Preset | AI_REVIEWER_LLM_PROVIDER |
AI_REVIEWER_MISTRAL_MODEL |
AI_REVIEWER_MISTRAL_API_URL |
AI_REVIEWER_LLM_FALLBACK_PROVIDER |
|---|---|---|---|---|
| Gemini (podrazumijevano) | google |
(prazno) | (prazno) | (prazno) |
| Mistral Large | mistral |
mistral-large-latest |
(prazno) | google |
| Codestral free | mistral |
codestral-latest |
https://codestral.mistral.ai |
google |
| Devstral | mistral |
devstral-latest |
(prazno) | google |
Codestral free tier ključ
Za preset „Codestral free" AI_REVIEWER_MISTRAL_API_KEY mora sadržavati ključ sa codestral.mistral.ai, ne sa console.mistral.ai.
Nije potrebno unositi u YAML
Za razliku od GitHub Actions (gdje se inputi moraju eksplicitno mapirati), GitLab CI automatski prosljeđuje sve CI/CD varijable kao varijable okruženja. Samo ih postavite u interfejsu — aplikacija ih prepoznaje preko prefiksa AI_REVIEWER_*.
Rezultat revizije¶
Bilješke (komentari)¶
AI Review objavljuje komentare na MR kao bilješke.
Diskusije (inline)¶
Za inline komentare, trebate Personal Access Token ili Project Access Token.
Inline komentari se pojavljuju direktno pored linija koda u diff pogledu.
Rezime¶
Na kraju revizije, objavljuje se bilješka Rezime sa:
- Ukupnom statistikom
- Metrikama
- Dobrim praksama
Rješavanje problema¶
Revizija ne objavljuje komentare¶
Provjerite:
AI_REVIEWER_GOOGLE_API_KEYvarijabla je podešenaAI_REVIEWER_GITLAB_TOKENima dovoljne dozvole (scope:api)- Pipeline se pokreće za MR (ne za granu)
"401 Unauthorized"¶
Uzrok: Nevažeći token.
Rješenje:
- Provjerite da token nije istekao
- Provjerite scope (potreban
api)
"403 Forbidden"¶
Uzrok: Nedovoljne dozvole.
Rješenje:
- Provjerite da koristite Personal Access Token (ne
CI_JOB_TOKEN) - Provjerite da token ima pristup projektu
"404 Not Found"¶
Uzrok: MR nije pronađen.
Rješenje:
- Provjerite da se pipeline pokreće za MR
- Provjerite
CI_MERGE_REQUEST_IID
Rate Limit (429)¶
Uzrok: Prekoračeno API ograničenje.
Rješenje:
- AI Code Reviewer automatski ponavlja sa eksponencijalnim backoff-om
- Ako se nastavi — sačekajte ili povećajte ograničenja
Najbolje prakse¶
1. Koristite PAT za punu funkcionalnost¶
2. Dodajte allow_failure¶
MR neće biti blokiran ako revizija ne uspije.
3. Podesite timeout¶
4. Učinite job prekidivim¶
Stara revizija će se otkazati na novi commit.
5. Ne čekajte druge faze¶
Revizija će početi odmah, bez čekanja na build/test.