From 69ebabce779f0526f797e96ca97ff9850702c20d Mon Sep 17 00:00:00 2001 From: Nyako Date: Fri, 11 Sep 2026 16:44:29 +0300 Subject: [PATCH] first commit --- .gitea/workflows/ai-review.yml | 65 ++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 23 deletions(-) diff --git a/.gitea/workflows/ai-review.yml b/.gitea/workflows/ai-review.yml index d1b5a33..3a8f15b 100644 --- a/.gitea/workflows/ai-review.yml +++ b/.gitea/workflows/ai-review.yml @@ -19,23 +19,39 @@ jobs: OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} GITEA_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - # Получаем diff текущего PR относительно целевой ветки - git diff origin/${{ gitea.event.pull_request.base.ref }}...HEAD > pr.diff + # 1. Безопасно определяем целевую ветку (base ref) + TARGET_BRANCH="${{ gitea.event.pull_request.base.ref }}" + if [ -z "$TARGET_BRANCH" ]; then + TARGET_BRANCH="${{ gitea.default_branch }}" + fi + + # 2. Безопасно определяем номер PR + PR_INDEX="${{ gitea.event.pull_request.number }}" + if [ -z "$PR_INDEX" ]; then + # Пробуем получить номер PR из события или отменяем отправку в комментарии + PR_INDEX="${{ gitea.event.number }}" + fi + + # Подтягиваем ветку назначения из origin + git fetch origin "$TARGET_BRANCH" --depth=1 || true + + # Сравниваем с целевой веткой + git diff "origin/$TARGET_BRANCH...HEAD" > pr.diff + + if [ ! -s pr.diff ]; then + echo "Diff пуст. Прерывание." + exit 0 + fi - # Ограничиваем размер диффа, чтобы не превысить лимиты контекста (первые ~1200 строк) head -n 1200 pr.diff > pr_trimmed.diff - # Подготовка системного промпта SYSTEM_PROMPT="Ты — автоматический анализатор кода. Твоя единственная задача — дать краткую, точную сводку изменений на русском языке.\n\nПРАВИЛА:\n1. Описывай ТОЛЬКО то, что фактически изменилось.\n2. НЕ ДАВАЙ никаких рекомендаций, советов, критики или указаний на ошибки.\n3. Пиши кратко списком (bullet points)." - # Экранируем diff для безопасной вставки в JSON - DIFF_ESCAPED=$(jq -sR . pr_trimmed.diff) - - # Формируем JSON-нагрузку + # Безопасное формирование JSON через jq (без вложенных экранирований) PAYLOAD=$(jq -n \ --arg model "claude-sonnet-4-6" \ --arg sys "$SYSTEM_PROMPT" \ - --arg diff "$DIFF_ESCAPED" \ + --arg diff "$(cat pr_trimmed.diff)" \ '{ model: $model, messages: [ @@ -45,29 +61,32 @@ jobs: temperature: 0.2 }') - # Запрос к OpenAI API RESPONSE=$(curl -s https://ai.arbz.lol/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d "$PAYLOAD") - # Извлекаем ответ нейросети - SUMMARY=$(echo "$RESPONSE" | jq -r '.choices[0].message.content') + SUMMARY=$(echo "$RESPONSE" | jq -r '.choices[0].message.content // empty') - if [ -z "$SUMMARY" ] || [ "$SUMMARY" == "null" ]; then - echo "Ошибка получения ответа от API:" + if [ -z "$SUMMARY" ]; then + echo "Ошибка выполнения API-запроса:" echo "$RESPONSE" exit 1 fi - # Добавляем заголовок и публиуем комментарий в PR через Gitea API - COMMENT_BODY=$(jq -n --arg body "### 📝 Краткий обзор изменений\n\n$SUMMARY" '{body: $body}') + echo "--- Сводка изменений ---" + echo "$SUMMARY" - PR_INDEX="${{ gitea.event.pull_request.number }}" - REPO="${{ gitea.repository }}" - SERVER_URL="${{ gitea.server_url }}" + # Публикуем комментарий, только если это был контекст Pull Request + if [ -n "$PR_INDEX" ] && [ "$PR_INDEX" != "null" ]; then + COMMENT_BODY=$(jq -n --arg body "### 📝 Краткий обзор изменений\n\n$SUMMARY" '{body: $body}') + REPO="${{ gitea.repository }}" + SERVER_URL="${{ gitea.server_url }}" - curl -s -X POST "$SERVER_URL/api/v1/repos/$REPO/issues/$PR_INDEX/comments" \ - -H "Content-Type: application/json" \ - -H "Authorization: token $GITEA_TOKEN" \ - -d "$COMMENT_BODY" \ No newline at end of file + curl -s -X POST "$SERVER_URL/api/v1/repos/$REPO/issues/$PR_INDEX/comments" \ + -H "Content-Type: application/json" \ + -H "Authorization: token $GITEA_TOKEN" \ + -d "$COMMENT_BODY" + else + echo "Номер PR не найден, отправка комментария пропущена." + fi \ No newline at end of file