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. Проверка: Шаблон сообщения коммита [1] ... - 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 # Проверяем, начинается ли сообщение с [X] (где X - цифра) # Регулярное выражение: символ '^', открывающая '[', цифра, закрывающая ']' if ! echo "$commit_msg" | grep -q "^\[[0-9]+\]"; then echo "❌ ОШИБКА: Коммит '$commit_msg' не соответствует шаблону '[X] *'" echo "Коммит должен начинаться с цифры в квадратных скобках, например: [1] ..." exit 1 fi done echo "✅ Шаблон сообщений соответствует требованиям." # 4. Проверка: Проверка, что файлы лежат в подпапке автора - name: Check Files Location 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 file locations..." # Получаем список файлов, которые изменились или добавились в PR git diff --name-only --diff-filter=ACM $BASE_SHA..$HEAD_SHA | while read -r file; do # Извлекаем первую папку из пути к файлу (разделитель '/') # Например: "author/subfolder/file.txt" -> "author" first_folder=$(echo "$file" | cut -d'/' -f1) # Проверяем, совпадает ли эта папка с именем автора PR if [ "$first_folder" != "$USERNAME" ]; then echo "❌ ОШИБКА: Файл '$file' не находится в подпапке автора ('$USERNAME')." echo "Все изменения должны лежать в папке с именем автора." exit 1 fi done echo "✅ Файлы находятся в правильных папках."