Files
GitHubToGiTea/.woodpecker/sync-releases.yml
EnotAdmin d3d8da3acc
Some checks failed
ci/woodpecker/cron/sync-releases Pipeline failed
Обновить .woodpecker/sync-releases.yml
2025-05-05 18:56:13 +03:00

126 lines
7.4 KiB
YAML
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.

# .woodpecker/sync-releases.yml
when:
event: cron
cron:
include:
- sync-hourly
steps:
- name: sync_releases
image: debian:stable-slim
environment:
GITEA_TOKEN:
from_secret: gitea_token
GITHUB_TOKEN:
from_secret: github_token
GITEA_URL:
from_secret: gitea_url
REPO_LIST_FILE: repos_to_sync.txt
commands:
# 1. Установка зависимостей
- apt-get update && apt-get install -y curl jq bash
# 2. Запуск скрипта синхронизации
- |
#!/bin/bash
set -e
set -x # ОСТАВЬТЕ ДЛЯ ПЕРВОГО ЗАПУСКА
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 (outside subshell): $GITEA_URL"
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)"
# Дополнительная проверка доступности GITEA_URL ВНУТРИ subshell
SUBSHELL_GITEA_URL=$(echo "$GITEA_URL")
echo "GITEA_URL (from inside subshell): $SUBSHELL_GITEA_URL"
if [ -z "$SUBSHELL_GITEA_URL" ]; then
echo "FATAL: GITEA_URL seems empty inside subshell!"
# Попробуем без sed, если subshell пуст
GITEA_BASE_URL="$GITEA_URL" # Просто присвоим, чтобы увидеть, сработает ли это
echo "Attempting direct assignment for GITEA_BASE_URL: $GITEA_BASE_URL"
else
# Если subshell работает, используем echo | sed
echo "Subshell check OK. Calculating GITEA_BASE_URL using echo | sed..."
GITEA_BASE_URL=$(echo "${SUBSHELL_GITEA_URL}" | sed 's|/api/v1$||; s|/*$||')
fi
# Проверка результата после вычисления
if [ -z "$GITEA_BASE_URL" ]; then echo "FATAL: Failed to calculate GITEA_BASE_URL!"; exit 1; fi
GITEA_API_URL="${GITEA_BASE_URL}/api/v1"
echo "Final GITEA_BASE_URL: ${GITEA_BASE_URL}"
echo "Final GITEA_API_URL: ${GITEA_API_URL}"
echo "--- End Variable Checks ---"
GITEA_AUTH_HEADER="Authorization: token ${GITEA_TOKEN}"
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;
}
# --- Основной цикл ---
# ... (без изменений, но теперь должен работать с правильными URL) ...
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')
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...";
GITHUB_RELEASES_JSON=$(curl -sf --fail -H "$GITHUB_AUTH_HEADER" "${FETCH_GITHUB_URL}") || { echo "Error GitHub fetch: $GITHUB_REPO_PATH"; continue; }
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."