Як підʼєднати ChatGPT до код-рев’ю

18 Липня, 2024 4 хвилин читання

Ви хотіли б, щоб кожен ваш pull/merge request спочатку перевіряв ChatGPT-4, а вже потім ви? Хочете моментальний фідбек про зміни в коді перед тим, як це побачать колеги? А як щодо виявлення того, хто і де вкомітив конфіденційні дані або API-ключі, з можливістю одразу тегнути «винуватця» для виправлення?

Ми добре знаємо, що GPT вміє непогано генерувати код… Але рев’ювити його він може (як виявилось) не гірше! Тож зараз я розкажу, як можна під’єднати ШІ, який буде автоматично розглядати зміни в коді та давати вам змістовний фідбек.

Такий тулінг буде корисним і для DevSecOps-інженерів, і для всіх, хто проводить код-ревʼю. Це не замінить інженера, але допоможе з рутиною.

Одразу покажу, як ця магія працює на практиці (але вимушений заблюрити частини коду, щоб не показати зайвого).

1) Перший кейс — в тестовому репозиторії я додав JSON-файл із трохи зламаним форматуванням та plainext-паролями, відтворивши security leak, та створив Merge Request.

GPT-4o це просто так не пропустить:

Як бачимо, ШІ не тільки виявив senstitive information, але й замаскував її у своєму коментарі та тегнув мене, щоб я це прибрав.

Або ось так: інше ревʼю, але суть та ж сама — перевірити, як впорається ШІ з комітом sensitive information:

Набагато потужніша аналітика, аніж тули типу GitLeaks, які статично роблять простий пошук за regex та wildcards.

2) Другий кейс — це приклади з фронтових Merge Requests (скриншоти колеги), виділю тільки певні моменти:

Модель GPT-4o демонструє непогані знання React. Ось цей дизайн з key — його всі знають, але всі забувають.

Або ось тут, ніби книжку прочитав:

Прикладів можу навести багато, але суть в тому, що ці рекомендації мають сенс! Звісно, не всі зауваження варті уваги, але велика частина є справді корисною.

Реалізація

Викладу ідею, як за одну годину можна на Python напрограмувати собі автоматизований рев`ю процес. Я б із задоволенням поділився вже готовим кодом, але, на жаль, не можу (company complains, you must understand). Тому викладу ідею з архітектурними блоками, щоб ви могли скласти це як конструктор.Нотатка для DevOps-інженерів — цей код варто одразу додати в CI/CD-флоу для отримання максимального ефекту та автоматизації процесу. Його ідеально загорнути в одну CI/CD-джобу і виконувати на кожному MR/PR (тільки зробіть виняток для змін від renovate/dependabot).

До справи: беремо Python та пишемо код.

 

1. Нам знадобиться підʼєднання до ШІ-моделі

import openai

Це може бути GPT-4o від OpenAI. Але я рекомендую Azure OpenAI, оскільки Azure обіцяє не передавати код і не тренуватися на ньому.

from openai import AzureOpenAI

Запитайте у GPT, як це зробити, якщо це у вас вперше.

 

2. Отримуємо зміни в коді та коментарі цих до змін

Ми використовуємо GitLab, тож на його прикладі одразу дам ендпоінти:

/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/changes?access_raw_diffs=true
/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes?order_by=created_at&sort=asc

де:

gitlab_request_id = os.getenv("CI_MERGE_REQUEST_IID")

gitlab_project_id = os.getenv("CI_PROJECT_ID")

Для краси JSON-відповідь від GitLab треба буде розпарсити.

 

3. Надсилаємо код на ШІ-рев`ю

Не забуваємо на початку додати промпт з поясненнями, що робити, і складаємо це все в один запит:

review_request=f"{prompt}\n\n{notes}\n\n{changes}"

В промпті треба ввічливо попросити ШІ проаналізувати ваші зміни в коді за критеріями: щось типу такого (дуже спрощений варіант у порівнянні з тим, що використовуємо ми):

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! Отриману відповідь просто постимо як коментар

Створіть GitLab PAT token для цього з іменем AI MR review та направте POST на MR notes API:

/api/v4/projects/{gitlab_project_id}/merge_requests/{gitlab_request_id}/notes

Висновки

Імплементація цього рішення покращить процес для:

  • DevSecOps: значно додасть security;
  • Senior+ рівня: тепер можна знаходити помилки та недоліки в MR/PR, не вчитуючись у код — це зробить за вас ШІ;
  • розробки/QA: одразу отримати на диво корисні зауваження та рекомендації;
  • бізнесу: на виході отримати трохи кращий код.

Серед недоліків інструменту — вартість. Її складно спрогнозувати. Усе буде залежати від того, як багато ви плануєте передавати на рев`ю та яка власне модель буде робити рев`ю.

Є ризик, звісно, впасти в постійне вдосконалення: ідеї для покращення такого інструменту можуть бути нескінченними. Але не завжди більше контексту означає краще ревʼю. А ітеративне тестування змін вимагає певного часу. І ми можемо стати ще більш лінивими, але лінь — це рушій прогресу, чи не так?

А ще — уявіть можливості. Це буде ваш скрипт, тому, наприклад, можна:

  • додати контекст завдання з Jira;
  • зробити самарі для PM;
  • написати release notes/release changes;
  • пошукати вразливості.

Тож робимо наш код краще, а життя простішим. Welcome to AI era, dear colleagues!

Цей матеріал було опубліковано на DOU.ua.

Дмитро Дяченко
DevOps Engineer
У пошуку ідеальної вакансії?
Надсилай нам своє резюме і ми зв'яжемося з тобою.