AI в CI/CD пайплайне позволяет автоматизировать рутинные задачи: ревью кода, генерация тестов, проверка качества commit-сообщений. В этой статье мы интегрируем ModelSwitch API в GitHub Actions для автоматического код-ревью pull request-ов.
Автоматическое ревью Pull Request
Создадим GitHub Action, который анализирует diff в pull request и оставляет комментарий с замечаниями:
# .github/workflows/ai-review.yml
name: AI Code Review
on:
pull_request:
types: [opened, synchronize]
jobs:
review:
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: read
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get PR diff
id: diff
run: |
DIFF=$(git diff origin/${{ github.base_ref }}..HEAD -- '*.py' '*.ts' '*.js' | head -c 10000)
echo "diff<> $GITHUB_OUTPUT
echo "$DIFF" >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: AI Review
uses: actions/github-script@v7
env:
MODELSWITCH_API_KEY: ${{ secrets.MODELSWITCH_API_KEY }}
with:
script: |
const diff = `${{ steps.diff.outputs.diff }}`;
if (!diff.trim()) return;
const response = await fetch("https://api.modelswitch.ru/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.MODELSWITCH_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "gpt-4o",
messages: [
{
role: "system",
content: "Ты опытный код-ревьюер. Проанализируй diff и укажи: баги, проблемы безопасности, нарушения best practices. Пиши на русском. Будь конкретен."
},
{ role: "user", content: diff }
],
max_tokens: 2000
})
});
const data = await response.json();
const review = data.choices[0].message.content;
await github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: `## AI Code Review
${review}
---
*Powered by ModelSwitch*`
});
Генерация unit-тестов
Создайте скрипт, который генерирует тесты для новых или изменённых файлов:
# scripts/generate_tests.py
import os
import sys
from openai import OpenAI
client = OpenAI(
base_url="https://api.modelswitch.ru/v1",
api_key=os.environ["MODELSWITCH_API_KEY"],
)
def generate_tests(file_path: str) -> str:
with open(file_path, "r") as f:
source_code = f.read()
response = client.chat.completions.create(
model="claude-3.5-sonnet", # Claude отлично генерирует тесты
messages=[
{
"role": "system",
"content": (
"Ты генератор unit-тестов. На основе исходного кода "
"напиши pytest-тесты. Покрой основные сценарии, "
"граничные случаи и обработку ошибок. Верни только код тестов."
),
},
{"role": "user", "content": f"Файл: {file_path}
{source_code}"},
],
max_tokens=3000,
)
return response.choices[0].message.content or ""
if __name__ == "__main__":
for path in sys.argv[1:]:
tests = generate_tests(path)
test_path = path.replace("/", "/test_").replace(".py", "_test.py")
with open(test_path, "w") as f:
f.write(tests)
print(f"Generated tests: {test_path}")
Проверка commit-сообщений
Добавьте Git hook для валидации и улучшения commit-сообщений с помощью AI:
#!/bin/bash
# .git/hooks/prepare-commit-msg
COMMIT_MSG_FILE=$1
DIFF=$(git diff --cached --stat)
SUGGESTION=$(curl -s https://api.modelswitch.ru/v1/chat/completions -H "Authorization: Bearer $MODELSWITCH_API_KEY" -H "Content-Type: application/json" -d "{
"model": "gpt-4o-mini",
"messages": [
{"role": "system", "content": "На основе git diff предложи краткое commit-сообщение на английском в формате conventional commits."},
{"role": "user", "content": "$DIFF"}
],
"max_tokens": 100
}" | jq -r '.choices[0].message.content')
echo "$SUGGESTION" > "$COMMIT_MSG_FILE"
Рекомендации по использованию AI в CI/CD
При интеграции AI в CI/CD пайплайн важно соблюдать несколько правил: ограничивайте размер diff (10 000 символов достаточно для качественного ревью), используйте дешёвые модели (GPT-4o-mini) для простых проверок и мощные (Claude) для генерации кода, храните API-ключ в GitHub Secrets и устанавливайте бюджетные лимиты через ModelSwitch.
Не полагайтесь на AI-ревью полностью — используйте его как дополнительный инструмент проверки, а не замену ручного ревью.
Заключение
AI в CI/CD существенно ускоряет разработку: автоматическое ревью находит баги до мержа, генерация тестов увеличивает покрытие, а умные commit-сообщения улучшают читаемость истории. ModelSwitch даёт доступ к лучшим моделям через единый API, что упрощает интеграцию в любой CI/CD пайплайн.