[PR] add workflow yaml
This commit is contained in:
parent
9d04eb60bb
commit
4e4f9e6235
75
.gitea/workflows/pr-validation.yml
Normal file
75
.gitea/workflows/pr-validation.yml
Normal file
|
|
@ -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 "✅ Файлы соответствуют папке автора."
|
||||||
Loading…
Reference in New Issue
Block a user