Pozwól, aby ChatGPT przeprowadził code review za Ciebie
Era sztucznej inteligencji już się rozpoczęła. Każdy, kto pracuje w IT, zna już naszego „nowego najlepszego przyjaciela” do tworzenia oprogramowania — AI.
Pracuję na stanowisku DevOps Engineer w Innovecs i chciałbym podzielić się jednym z najnowszych odkryć.
Koncepcja
- Chcielibyście, aby każdy wasz Pull/Merge Request był najpierw sprawdzany przez ChatGPT-4, a dopiero potem przez was?
- Chcecie otrzymać natychmiastową opinię na temat zmian w kodzie, zanim zobaczą je koledzy?
- A co z wykrywaniem, kto i gdzie wkomitował dane poufne lub klucze API, z możliwością od razu oznaczenia „winowajcy” do poprawki?
Dobrze wiemy, że GPT potrafi całkiem nieźle generować kod... Ale przeglądać go może (jak się okazało) nie gorzej!
Od razu pokażę, jak ta magia działa w praktyce (ale muszę zamazać części kodu, aby nie pokazać za dużo).
1. Utworzyłem testowy Merge Request, w którym dodałam plik JSON z lekko uszkodzonym formatowaniem i zwykłymi tekstami haseł, odtwarzając security leak:
Jak widać, AI nie tylko wykrył poufne informacje, ale także zamaskował je w swoim komentarzu + oznaczył mnie, abym je usunął.
A oto inne przeglądy:
Znacznie potężniejsza analiza, niż narzędzia takie jak GitLeaks, które wykonują prostą wyszukiwarkę statycznie za pomocą wyrażeń regularnych i symboli wieloznacznych.
2. Przykłady z frontowych Merge Requests (zrzuty ekranu kolegi), podkreślę tylko pewne momenty:
Model GPT-4o pokazuje całkiem niezłą znajomość React. Oto ten design z key — wszyscy go znają, ale wszyscy zapominają.
Albo tutaj, jakby przeczytał książkę:
Mogę podać wiele przykładów, ale chodzi o to, że jego rekomendacje mają sens!
Oczywiście, nie wszystkie uwagi są warte uwagi, ale duża część jest naprawdę przydatna.
Realizacja
Podzielę się pomysłem, jak w ciągu jednej godziny można w Pythonie zaprogramować sobie zautomatyzowany proces przeglądu.
Ten kod warto od razu dodać do przepływu CI/CD, aby uzyskać maksymalny efekt i automatyzację procesu.
Idealnie jest zawinąć go w jedną pracę CI/CD i uruchamiać na każdym MR/PR (tylko zróbcie wyjątek dla zmian od renovate / dependabot).
Chętnie podzieliłbym się już gotowym kodem, ale niestety nie mogę (company complains, you must understand). Dlatego podzielę się pomysłem z blokami architektonicznymi, abyście mogli to złożyć jak klocki.
Do dzieła, bierzemy Python i piszemy kod.
1. Będziemy potrzebować połączenia do modelu AI.
import openai
To może być GPT-4o od OpenAI. Ale polecam Azure OpenAI, ponieważ Azure obiecuje nie przekazywać kodu i nie trenować na nim.
from openai import AzureOpenAI
Zapytajcie GPT, jak to zrobić, jeśli robicie to po raz pierwszy.
2. Pobieramy zmiany w kodzie i komentarze do tych zmian.
Używamy GitLab, więc na jego przykładzie od razu podam endpointy:
a) Code changes using MR changes API:
/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/changes?access_raw_diffs=true
b) Comments using MR notes API:
/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes?order_by=created_at&sort=asc
where:
gitlab_request_id = os.getenv("CI_MERGE_REQUEST_IID")
gitlab_project_id = os.getenv("CI_PROJECT_ID")
Dla estetyki odpowiedź JSON z GitLab trzeba będzie sparsować.
3. Wysyłamy kod na przegląd AI.
Nie zapominamy na początku dodać prompt z wyjaśnieniami co robić i składamy to wszystko w jedno zapytanie:
review_request=f"{prompt}\n\n{notes}\n\n{changes}"
W prompt trzeba uprzejmie poprosić AI o przeanalizowanie waszych zmian w kodzie według kryteriów — coś w tym stylu (bardzo uproszczona wersja w porównaniu do tej, której używamy my):
“As a Developer, I want to ask you to perform a GitLab Merge Request review.
Consider previous comments noted below and avoid repeating similar recommendations.
If you spot a recurring issue, skip it.
For security issues or sensitive information leaks, mention the assignee's username with @.
Make your feedback clear, concise, and actionable, with specific improvement recommendations.
Review the code snippet below based on these criteria:
- Syntax and Style: Look for syntax errors and deviations from conventions.
- Performance Optimization: Suggest changes to improve efficiency.
- Security Practices: Check for vulnerabilities and hard-coded secrets (mask half the info).
- Error Handling: Identify unhandled exceptions or errors.
- Code Quality: Look for code smells, unnecessary complexity, or redundant code.
- Bug Detection: Find potential bugs or logical errors.”
4. That’s it! Otrzymaną odpowiedź po prostu zamieszczamy jako komentarz.
Utwórzcie GitLab PAT token dla tego z nazwą AI MR review i skierujcie POST na MR notes API:
/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes
Wnioski
Zalety
Implementacja tego rozwiązania przyniesie korzyści dla:
- DevSecOps: znacznie zwiększa bezpieczeństwo.
- Poziom Senior+: teraz można znaleźć błędy i niedociągnięcia w MR/PR bez wczytywania się w kod — AI zrobi to za was.
- Rozwój/QA: od razu otrzymujesz zaskakująco przydatne uwagi i rekomendacje.
- Biznes: na wyjściu otrzymuje nieco lepszy kod.
Wady
Koszt: trudny do przewidzenia. Wszystko zależy od tego, ile zamierzacie przekazać do przeglądu i jaki model będzie go przeprowadzać.
Ryzyka
Ciągłe doskonalenie: pomysły na ulepszenie takiego narzędzia mogą być nieskończone, nie zawsze więcej kontekstu oznacza lepszy przegląd. A iteracyjne testowanie zmian wymaga pewnego czasu.
„Ulepszenia”: możemy stać się jeszcze bardziej leniwi =), ale lenistwo jest motorem postępu, prawda?
Perspektywy
Wyobraźcie sobie możliwości, to będzie wasz skrypt, więc można na przykład:
- dodać kontekst zadania z Jira,
- stworzyć podsumowanie dla PM,
- napisać release notes/release changes,
- szukać luk w zabezpieczeniach.
Robimy więc nasz kod lepszy, a życie prostsze.
Welcome to AI era, dear colleagues!