From 4e4f9e62354dadd1fd617ef84edc33ed0ee1f228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20=D0=9C=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B7=D0=BE=D0=B2?= Date: Wed, 28 Jan 2026 15:10:47 +0300 Subject: [PATCH] [PR] add workflow yaml --- .gitea/workflows/pr-validation.yml | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 .gitea/workflows/pr-validation.yml diff --git a/.gitea/workflows/pr-validation.yml b/.gitea/workflows/pr-validation.yml new file mode 100644 index 0000000..768bc93 --- /dev/null +++ b/.gitea/workflows/pr-validation.yml @@ -0,0 +1,75 @@ + +name: PR Validation + +on: + pull_request: + branches: + - main + - develop + types: [opened, synchronize, reopened] + +jobs: + pr_checks: + runs-on: ubuntu-latest + steps: + # 1. Клонируем репозиторий + - name: Checkout code + uses: https://gitea.com/gitea/act_runner@v0.2.8 # Используем официальный action для проверки кода + with: + fetch-depth: 0 + + # 2. Получаем имя автора PR + - name: Get PR Author + id: pr_info + run: | + echo "username=${{ github.actor }}" >> $GITHUB_OUTPUT + echo "pr_number=${{ github.event.pull_request.number }}" >> $GITHUB_OUTPUT + + # 3. Проверка: Шаблон сообщения коммита [##] * + - name: Check Commit Message Format + run: | + USERNAME="${{ steps.pr_info.outputs.username }}" + BASE_SHA="${{ github.event.pull_request.base.sha }}" + HEAD_SHA="${{ github.event.pull_request.head.sha }}" + + echo "Checking commits between $BASE_SHA and $HEAD_SHA..." + + # Перебираем все коммиты в PR + git log $BASE_SHA..$HEAD_SHA --pretty=format:"%H %s" | while read -r commit_hash commit_msg; do + # Проверяем, начинается ли сообщение с [##] + if ! echo "$commit_msg" | grep -q "^[##]"; then + echo "❌ ОШИБКА: Коммит '$commit_msg' не соответствует шаблону '[##] *'" + echo "Коммит должен начинаться с '[##]'" + exit 1 + fi + done + echo "✅ Шаблон сообщений соответствует требованиям." + + # 4. Проверка: Изменения только в папке автора + - name: Check File Paths + run: | + USERNAME="${{ steps.pr_info.outputs.username }}" + BASE_SHA="${{ github.event.pull_request.base.sha }}" + HEAD_SHA="${{ github.event.pull_request.head.sha }}" + + echo "Checking files in changes..." + + # Получаем список измененных файлов + CHANGED_FILES=$(git diff --name-only $BASE_SHA..$HEAD_SHA) + + # Перебираем каждый файл + while IFS= read -r file; do + # Если файл существует (не пустой) + if [ -n "$file" ]; then + # Получаем имя папки (путь до первого слэша) + DIR_NAME=$(echo "$file" | cut -d'/' -f1) + + # Проверяем, что папка совпадает с username ИЛИ файл лежит в корне (пустая папка) + if [ "$DIR_NAME" != "$USERNAME" ] && [ -n "$DIR_NAME" ]; then + echo "❌ ОШИБКА: Файл '$file' находится в папке '$DIR_NAME', которая отличается от имени автора '$USERNAME'" + exit 1 + fi + fi + done <<< "$CHANGED_FILES" + + echo "✅ Файлы соответствуют папке автора."