Files
GitHubToGiTea/.woodpecker/sync-releases.sh
EnotAdmin a28da78333
All checks were successful
ci/woodpecker/cron/sync-releases Pipeline was successful
Обновить .woodpecker/sync-releases.sh
2025-05-05 20:15:28 +03:00

133 lines
7.6 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -e
set -x # МОЖНО ОТКЛЮЧИТЬ ДЛЯ ЭТОГО ТЕСТА, ЕСЛИ ЛОГ И ТАК ПОНЯТЕН
echo "Shell: $SHELL"
bash --version # Убедимся, что bash используется
echo "Starting release sync..."
REPO_FILE="${REPO_LIST_FILE:-repos_to_sync.txt}"
# --- Проверки Переменных ---
echo "--- Variable Checks ---"
if [ -z "$GITEA_URL" ]; then echo "FATAL: GITEA_URL is empty!"; exit 1; fi
echo "GITEA_URL check: OK (value hidden)"
if [ -z "$GITEA_TOKEN" ]; then echo "FATAL: GITEA_TOKEN is empty!"; exit 1; fi
echo "GITEA_TOKEN check: OK (value hidden)"
if [ ! -f "$REPO_FILE" ]; then echo "FATAL: File '$REPO_FILE' not found!"; exit 1; fi
echo "REPO_FILE check: OK ($REPO_FILE)"
echo "--- End Variable Checks ---"
GITEA_AUTH_HEADER="Authorization: token ${GITEA_TOKEN}"
# Используем echo | sed для совместимости
echo "Calculating GITEA_BASE_URL from GITEA_URL..."
GITEA_BASE_URL=$(echo "${GITEA_URL}" | sed 's|/api/v1$||; s|/*$||')
if [ -z "$GITEA_BASE_URL" ]; then
echo "FATAL: GITEA_BASE_URL is empty after sed processing GITEA_URL='${GITEA_URL}'!"
exit 1
fi
GITEA_API_URL="${GITEA_BASE_URL}/api/v1"
echo "Calculated Gitea Base URL: ${GITEA_BASE_URL}"
echo "Calculated Gitea API URL: ${GITEA_API_URL}"
GITHUB_AUTH_HEADER=""
if [ -n "$GITHUB_TOKEN" ]; then GITHUB_AUTH_HEADER="Authorization: token ${GITHUB_TOKEN}"; fi
GITHUB_API_URL="https://api.github.com"
# --- Вспомогательные функции ---
download_asset() { local url="$1"; local filename="$2"; echo "Downloading asset: $filename"; curl -L -H "$GITHUB_AUTH_HEADER" -o "$filename" "$url"; return $?; }
upload_asset() {
local repo="$1"; local id="$2"; local file="$3"
local filename_basename=$(basename "$file")
echo "Uploading asset: $file (as $filename_basename)"
local TARGET_URL="${GITEA_API_URL}/repos/${repo}/releases/${id}/assets?name=${filename_basename}"
echo "DEBUG: Upload Asset URL: ${TARGET_URL}"
curl -sf --fail -X POST -H "$GITEA_AUTH_HEADER" -H "Content-Type: application/octet-stream" --data-binary "@$file" "${TARGET_URL}"
local status=$?; if [ $status -eq 0 ]; then rm "$file"; fi; return $status;
}
# --- Основной цикл ---
echo "Reading repository list from $REPO_FILE"
while IFS= read -r repo_pair || [[ -n "$repo_pair" ]]; do
if [[ -z "$repo_pair" || "$repo_pair" == \#* ]]; then continue; fi
if ! echo "$repo_pair" | grep -q ':'; then echo "Warning: Skipping invalid line: $repo_pair"; continue; fi
GITHUB_REPO_PATH=$(echo "$repo_pair" | cut -d':' -f1); GITEA_REPO_PATH=$(echo "$repo_pair" | cut -d':' -f2)
echo "-------------------------------------"; echo "Syncing: $GITHUB_REPO_PATH -> $GITEA_REPO_PATH"
FETCH_GITEA_URL="${GITEA_API_URL}/repos/${GITEA_REPO_PATH}/releases"
echo "DEBUG: Fetch Gitea Releases URL: ${FETCH_GITEA_URL}"
echo "Fetching Gitea releases...";
GITEA_RELEASES_JSON=$(curl -sf --fail -H "$GITEA_AUTH_HEADER" "${FETCH_GITEA_URL}") || { echo "Error Gitea fetch: $GITEA_REPO_PATH"; continue; }
EXISTING_GITEA_TAGS=$(echo "$GITEA_RELEASES_JSON" | jq -r '.[].tag_name')
# --- Отладка запроса к GitHub ---
FETCH_GITHUB_URL="${GITHUB_API_URL}/repos/${GITHUB_REPO_PATH}/releases?per_page=20"
echo "DEBUG: Fetch GitHub Releases URL: ${FETCH_GITHUB_URL}"
echo "Fetching GitHub releases (with verbose output)...";
# Запускаем curl с -v для подробного вывода, БЕЗ -f и -s, чтобы увидеть ответ
# Сохраняем и тело, и ошибки в переменные
GITHUB_RESPONSE=$(curl -v -H "$GITHUB_AUTH_HEADER" "${FETCH_GITHUB_URL}" 2>&1) # 2>&1 перенаправляет stderr в stdout
GITHUB_CURL_EXIT_CODE=$? # Сохраняем код выхода curl
echo "--- GitHub curl Response Start ---"
echo "$GITHUB_RESPONSE" # Печатаем весь вывод curl -v
echo "--- GitHub curl Response End ---"
echo "GitHub curl exit code: $GITHUB_CURL_EXIT_CODE"
# Проверяем код выхода curl
if [ $GITHUB_CURL_EXIT_CODE -ne 0 ]; then
echo "Error: curl command to GitHub failed with exit code $GITHUB_CURL_EXIT_CODE. Skipping repo $GITHUB_REPO_PATH."
continue
fi
# Пытаемся извлечь тело ответа (может быть сложно из-за вывода -v)
# Попробуем просто проверить, содержит ли ответ HTTP/1.1 200 OK или HTTP/2 200
if ! echo "$GITHUB_RESPONSE" | grep -q -E '(HTTP/(1\.1|2) 200 OK|HTTP/(1\.1|2) 200)'; then
echo "Error: GitHub API did not return HTTP 200 OK. Skipping repo $GITHUB_REPO_PATH."
# Дополнительный вывод при ошибке статуса
echo "Received status was:"
echo "$GITHUB_RESPONSE" | grep -E '^< HTTP/'
continue
fi
# Если все ок, пытаемся извлечь JSON (может потребовать доработки, если -v мешает)
# Простой вариант: считаем, что если код 200, то JSON в конце
GITHUB_RELEASES_JSON=$(echo "$GITHUB_RESPONSE" | awk '/^{|^\[/{f=1} f') # Пытаемся извлечь JSON с начала строки { или [
if [ -z "$GITHUB_RELEASES_JSON" ]; then
echo "Warning: GitHub API returned HTTP 200 OK, but failed to extract JSON body. Response was:"
echo "$GITHUB_RESPONSE"
echo "Skipping repo $GITHUB_REPO_PATH."
continue
fi
echo "Successfully fetched GitHub releases JSON."
# --- Конец отладки запроса к GitHub ---
echo "$GITHUB_RELEASES_JSON" | jq -c '.[] | select(.draft == false)' | tac | while IFS= read -r release_json; do
TAG_NAME=$(echo "$release_json" | jq -r '.tag_name')
if echo "$EXISTING_GITEA_TAGS" | grep -q -x -F "$TAG_NAME"; then continue; fi
echo ">>> New release: $TAG_NAME"; RELEASE_NAME=$(echo "$release_json" | jq -r '.name'); RELEASE_BODY=$(echo "$release_json" | jq -r '.body // ""'); IS_PRERELEASE=$(echo "$release_json" | jq -r '.prerelease'); ASSETS=$(echo "$release_json" | jq -c '.assets[]')
CREATE_GITEA_URL="${GITEA_API_URL}/repos/${GITEA_REPO_PATH}/releases"
echo "DEBUG: Create Gitea Release URL: ${CREATE_GITEA_URL}"
echo "Creating Gitea release $TAG_NAME...";
CREATE_PAYLOAD=$(jq -n --arg t "$TAG_NAME" --arg n "$RELEASE_NAME" --arg b "$RELEASE_BODY" --argjson p "$IS_PRERELEASE" '{tag_name:$t, name:$n, body:$b, prerelease:$p}')
GITEA_NEW_RELEASE_JSON=$(curl -sf --fail -X POST -H "$GITEA_AUTH_HEADER" -H "Content-Type: application/json" -d "$CREATE_PAYLOAD" "${CREATE_GITEA_URL}") || { echo "Error creating Gitea release $TAG_NAME (maybe tag not synced?). Skipping."; continue; }
GITEA_RELEASE_ID=$(echo "$GITEA_NEW_RELEASE_JSON" | jq -r '.id'); echo "Gitea release ID: $GITEA_RELEASE_ID"
UPLOAD_FAILED_COUNT=0
if [ -n "$ASSETS" ]; then
echo "$ASSETS" | while IFS= read -r asset_json; do
ASSET_NAME=$(echo "$asset_json" | jq -r '.name'); ASSET_URL=$(echo "$asset_json" | jq -r '.browser_download_url'); TMP_ASSET_FILE="asset_${ASSET_NAME}"
if download_asset "$ASSET_URL" "$TMP_ASSET_FILE"; then if ! upload_asset "$GITEA_REPO_PATH" "$GITEA_RELEASE_ID" "$TMP_ASSET_FILE"; then ((UPLOAD_FAILED_COUNT++)); fi; else echo "Download failed: $ASSET_NAME"; ((UPLOAD_FAILED_COUNT++)); fi
done
else echo "No assets."; fi
if [ $UPLOAD_FAILED_COUNT -eq 0 ]; then echo "Release $TAG_NAME sync OK."; else echo "Release $TAG_NAME sync processed, $UPLOAD_FAILED_COUNT asset errors."; fi
done
echo "Finished: $GITHUB_REPO_PATH -> $GITEA_REPO_PATH"; echo "-------------------------------------"
done < "$REPO_FILE"
echo "Release sync finished."