Files
GitHubToGiTea/.woodpecker/sync-releases.yaml

91 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/sync-releases.yml
when:
event: cron
cron:
include:
- sync-hourly # Убедитесь, что имя совпадает с cron-заданием в Woodpecker
steps:
- name: sync_releases
image: alpine/git
environment:
# Определяем ВСЕ нужные переменные из секретов
GITEA_TOKEN:
from_secret: gitea_token
GITHUB_TOKEN:
from_secret: github_token # Этот секрет опционален, но нужен для API лимитов GitHub
GITEA_URL: # Используем просто GITEA_URL как имя переменной окружения
from_secret: gitea_url # Берем значение из секрета gitea_url
# Оставляем переменную для имени файла
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}"
# Переменная GITEA_URL теперь должна быть установлена из секрета
# Проверки переменных (теперь GITEA_URL тоже проверяется после инъекции секрета)
if [ -z "$GITEA_URL" ]; then echo "Error: GITEA_URL was not injected from secret 'gitea_url'!"; exit 1; fi
if [ -z "$GITEA_TOKEN" ]; then echo "Error: GITEA_TOKEN was not injected from secret 'gitea_token'!"; exit 1; fi
# GITHUB_TOKEN опционален
if [ ! -f "$REPO_FILE" ]; then echo "Error: Repository list file '$REPO_FILE' not found!"; exit 1; fi
echo "Using Gitea URL: $GITEA_URL" # Используем переменную GITEA_URL
GITEA_AUTH_HEADER="Authorization: token ${GITEA_TOKEN}"
# Формируем API URL на основе GITEA_URL из секрета
GITEA_API_URL="$(echo ${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."