Files
GitHubToGiTea/.woodpecker.yml

88 lines
6.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.yml (Исправленная структура)
# Определяем условия запуска пайплайна
when:
event: cron
# Укажите имя cron-задания, которое вы создали в настройках репозитория Woodpecker
# Если вы еще не создали cron-задание в UI Woodpecker, сделайте это.
# Дайте ему имя, например 'sync-hourly', и установите расписание '0 * * * *'
name: sync-hourly # <-- Убедитесь, что это имя совпадает с именем cron в настройках Woodpecker!
# Определяем шаги пайплайна
steps:
# Наш единственный шаг теперь является элементом списка под 'steps:'
- name: sync_releases # Имя шага
image: alpine/git
secrets: [ gitea_token, github_token ] # Токены (gitea_token обязателен!)
environment:
# Переменные окружения для скрипта
# GITEA_URL будет унаследована из окружения агента (WOODPECKER_GITEA_URL)
GITEA_TOKEN: ${GITEA_TOKEN}
GITHUB_TOKEN: ${GITHUB_TOKEN}
REPO_LIST_FILE: repos_to_sync.txt
commands:
# 1. Установка зависимостей
- apk update && apk add curl jq bash
# 2. Запуск скрипта синхронизации (сам скрипт остается без изменений)
- |
#!/bin/bash
set -e # Останавливаться при ошибках
# set -x # Для отладки
echo "Starting release sync..."
# --- Конфигурация ---
REPO_FILE="${REPO_LIST_FILE:-repos_to_sync.txt}"
CURRENT_GITEA_URL="${WOODPECKER_GITEA_URL}"
if [ -z "$CURRENT_GITEA_URL" ]; then echo "Error: GITEA_URL (from WOODPECKER_GITEA_URL) is not set!"; exit 1; fi
if [ -z "$GITEA_TOKEN" ]; then echo "Error: GITEA_TOKEN secret is not set!"; exit 1; fi
if [ ! -f "$REPO_FILE" ]; then echo "Error: Repository list file '$REPO_FILE' not found!"; exit 1; fi
echo "Using Gitea URL: $CURRENT_GITEA_URL"
GITEA_AUTH_HEADER="Authorization: token ${GITEA_TOKEN}"
GITEA_API_URL="$(echo ${CURRENT_GITEA_URL} | sed 's|/api/v1$||; s|/*$||')/api/v1"
echo "Using 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"; echo "Uploading asset: $file"; UPLOAD_URL="${GITEA_API_URL}/repos/${repo}/releases/${id}/assets?name=$(basename "$file")"; curl -sf --fail -X POST -H "$GITEA_AUTH_HEADER" -H "Content-Type: application/octet-stream" --data-binary "@$file" "$UPLOAD_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"
echo "Fetching Gitea releases..."; GITEA_RELEASES_JSON=$(curl -sf --fail -H "$GITEA_AUTH_HEADER" "${GITEA_API_URL}/repos/${GITEA_REPO_PATH}/releases") || { echo "Error Gitea fetch: $GITEA_REPO_PATH"; continue; }; EXISTING_GITEA_TAGS=$(echo "$GITEA_RELEASES_JSON" | jq -r '.[].tag_name')
echo "Fetching GitHub releases..."; GITHUB_RELEASES_JSON=$(curl -sf --fail -H "$GITHUB_AUTH_HEADER" "${GITHUB_API_URL}/repos/${GITHUB_REPO_PATH}/releases?per_page=20") || { 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[]')
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" "${GITEA_API_URL}/repos/${GITEA_REPO_PATH}/releases") || { 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."