132 lines
6.4 KiB
Bash
Executable File
132 lines
6.4 KiB
Bash
Executable File
#!/usr/bin/env zsh
|
||
|
||
# Выходить из скрипта при любой ошибке
|
||
set -e
|
||
|
||
# --- КОНФИГУРАЦИЯ ---
|
||
|
||
# Подключаем основной скрипт с функциями
|
||
source ./gitea-client.zsh
|
||
|
||
# Уникальный идентификатор для этого тестового запуска, чтобы избежать конфликтов
|
||
# Он будет добавлен к названиям задач, веток и т.д.
|
||
TEST_RUN_ID=$(date +%s)
|
||
TEST_BRANCH_NAME="test/auto-branch-${TEST_RUN_ID}"
|
||
TEST_ISSUE_TITLE="[AUTO-TEST] Test Issue ${TEST_RUN_ID}"
|
||
TEST_COMMIT_MESSAGE="feat: Add test file for run ${TEST_RUN_ID}"
|
||
TEST_PR_TITLE="[AUTO-TEST] PR for issue ${TEST_RUN_ID}"
|
||
TEST_COMMENT="This is an automated test comment."
|
||
|
||
# Глобальные переменные для хранения ID созданных сущностей
|
||
# Это нужно для функции очистки
|
||
typeset -g TEST_ISSUE_ID=""
|
||
typeset -g TEST_PR_ID=""
|
||
|
||
|
||
# --- ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ ---
|
||
|
||
# Функции для красивого вывода
|
||
log_info() { echo "\e[34mINFO:\e[0m $1"; }
|
||
log_pass() { echo "\e[32mPASS:\e[0m $1"; }
|
||
log_fail() { echo "\e[31mFAIL:\e[0m $1"; }
|
||
|
||
# Функция очистки. Будет вызвана при любом завершении скрипта (успешном или нет)
|
||
cleanup() {
|
||
log_info "--- Запускаю процедуру очистки ---"
|
||
|
||
# Удаляем локальную тестовую ветку, если она есть
|
||
if git rev-parse --verify "$TEST_BRANCH_NAME" >/dev/null 2>&1; then
|
||
git checkout main # или master, в зависимости от вашей основной ветки
|
||
git branch -D "$TEST_BRANCH_NAME"
|
||
log_info "Локальная ветка '$TEST_BRANCH_NAME' удалена."
|
||
fi
|
||
|
||
# Удаляем ветку на сервере, если она там осталась
|
||
# Gitea API для удаления ветки может вернуть ошибку, если PR уже смержен, это нормально
|
||
api_request "DELETE" "repos/$GITEA_OWNER/$GITEA_REPO/branches/$TEST_BRANCH_NAME" >/dev/null 2>&1 || true
|
||
log_info "Попытка удаления удаленной ветки '$TEST_BRANCH_NAME' выполнена."
|
||
|
||
|
||
# Если была создана задача, но она еще не закрыта, принудительно закрываем ее
|
||
if [[ -n "$TEST_ISSUE_ID" ]]; then
|
||
local issue_state=$(api_request "GET" "repos/$GITEA_OWNER/$GITEA_REPO/issues/$TEST_ISSUE_ID" | jq -r '.state')
|
||
if [[ "$issue_state" == "open" ]]; then
|
||
log_info "Задача #$TEST_ISSUE_ID все еще открыта. Закрываю принудительно..."
|
||
local close_data=$(jq -n '{state: "closed"}')
|
||
api_request "PATCH" "repos/$GITEA_OWNER/$GITEA_REPO/issues/$TEST_ISSUE_ID" "$close_data" >/dev/null
|
||
log_pass "Задача #$TEST_ISSUE_ID закрыта."
|
||
fi
|
||
fi
|
||
|
||
log_info "--- Очистка завершена ---"
|
||
}
|
||
|
||
# Устанавливаем "ловушку": функция cleanup будет вызвана при выходе из скрипта
|
||
trap cleanup EXIT
|
||
|
||
|
||
# --- ОСНОВНОЙ СЦЕНАРИЙ ТЕСТИРОВАНИЯ ---
|
||
|
||
function run_e2e_workflow() {
|
||
log_info "Начало полного E2E (end-to-end) теста..."
|
||
log_info "Тестовый ID этого запуска: ${TEST_RUN_ID}"
|
||
|
||
# Шаг 1: Создание задачи
|
||
log_info "Шаг 1: Создание тестовой задачи..."
|
||
local issue_json=$(create_task --title "$TEST_ISSUE_TITLE" )
|
||
TEST_ISSUE_ID=$(echo "$issue_json" | jq -r '.number') # Используем .number для issue ID
|
||
|
||
if [[ -z "$TEST_ISSUE_ID" || "$TEST_ISSUE_ID" == "null" ]]; then
|
||
log_fail "Не удалось создать задачу. Ответ API: $issue_json"
|
||
exit 1
|
||
fi
|
||
log_pass "Задача успешно создана с ID: #$TEST_ISSUE_ID"
|
||
|
||
# Шаг 2: Создание ветки, коммита и push
|
||
log_info "Шаг 2: Создание локальной ветки и коммита..."
|
||
git checkout -b "$TEST_BRANCH_NAME"
|
||
touch "test_file_${TEST_RUN_ID}.txt"
|
||
git add .
|
||
git commit -m "$TEST_COMMIT_MESSAGE"
|
||
log_pass "Ветка '$TEST_BRANCH_NAME' и коммит созданы."
|
||
log_info "Отправка ветки на сервер Gitea..."
|
||
git push origin "$TEST_BRANCH_NAME"
|
||
log_pass "Ветка успешно отправлена."
|
||
|
||
# Шаг 3: Создание Pull Request
|
||
log_info "Шаг 3: Создание Pull Request..."
|
||
local pr_json=$(create_pr --title "$TEST_PR_TITLE" --head "$TEST_BRANCH_NAME" --base "main")
|
||
TEST_PR_ID=$(echo "$pr_json" | jq -r '.number') # Используем .number для PR ID
|
||
|
||
if [[ -z "$TEST_PR_ID" || "$TEST_PR_ID" == "null" ]]; then
|
||
log_fail "Не удалось создать Pull Request. Ответ API: $pr_json"
|
||
exit 1
|
||
fi
|
||
log_pass "Pull Request успешно создан с ID: #$TEST_PR_ID"
|
||
|
||
# Шаг 4: Добавление комментария
|
||
log_info "Шаг 4: Добавление комментария к задаче #$TEST_ISSUE_ID..."
|
||
add_comment --issue-id "$TEST_ISSUE_ID" --body "$TEST_COMMENT" > /dev/null
|
||
log_pass "Комментарий успешно добавлен."
|
||
|
||
# Шаг 5: Слияние PR и закрытие задачи
|
||
log_info "Шаг 5: Выполнение 'merge_and_complete'..."
|
||
merge_and_complete --issue-id "$TEST_ISSUE_ID" --pr-id "$TEST_PR_ID" --branch "$TEST_BRANCH_NAME"
|
||
log_pass "Слияние PR и закрытие задачи прошли успешно."
|
||
|
||
log_info "Проверка статуса задачи..."
|
||
local final_state=$(api_request "GET" "repos/$GITEA_OWNER/$GITEA_REPO/issues/$TEST_ISSUE_ID" | jq -r '.state')
|
||
if [[ "$final_state" == "closed" ]]; then
|
||
log_pass "Финальная проверка: задача #$TEST_ISSUE_ID имеет статус 'closed'."
|
||
else
|
||
log_fail "Финальная проверка: задача #$TEST_ISSUE_ID имеет статус '$final_state' вместо 'closed'."
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
|
||
# --- ТОЧКА ВХОДА ---
|
||
run_e2e_workflow
|
||
|
||
log_pass "====== Весь E2E сценарий успешно завершен! ======"
|