Files
GitHubToGiTea/.woodpecker/sync-releases.yaml
EnotAdmin 2ce66b3ded
Some checks failed
ci/woodpecker/cron/sync-releases Pipeline failed
Обновить .woodpecker/sync-releases.yaml
2025-05-05 18:51:12 +03:00

105 lines
6.2 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.yaml
when:
event: cron
cron:
include:
- sync-hourly
steps:
- name: sync_releases
image: debian:stable-slim # Оставляем debian
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}"
if [ -z "$GITEA_URL" ]; then echo "Error: GITEA_URL was not injected!"; exit 1; fi
if [ -z "$GITEA_TOKEN" ]; then echo "Error: GITEA_TOKEN was not injected!"; exit 1; fi
if [ ! -f "$REPO_FILE" ]; then echo "Error: Repository list file '$REPO_FILE' not found!"; exit 1; fi
echo "Raw Gitea URL from secret: $GITEA_URL"
GITEA_AUTH_HEADER="Authorization: token ${GITEA_TOKEN}"
# ИСПРАВЛЕНИЕ: Возвращаем ${GITEA_URL} в echo !!!
GITEA_BASE_URL=$(echo "${GITEA_URL}" | sed 's|/api/v1$||; s|/*$||')
if [ -z "$GITEA_BASE_URL" ]; then echo "Error: Failed to calculate GITEA_BASE_URL!"; exit 1; fi
GITEA_API_URL="${GITEA_BASE_URL}/api/v1"
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')
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."