Files
GitHubToGiTea/.woodpecker/main.yaml
EnotAdmin 6798a9a5ed
Some checks failed
ci/woodpecker/cron/main Pipeline failed
Обновить .woodpecker/main.yaml
2025-05-05 17:37:31 +03:00

100 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.yml (Исправлено с учетом from_secret и структуры when)
# Определяем условия запуска пайплайна
when:
event: cron
# Фильтруем по имени cron-задания.
# Убедитесь, что имя 'sync-hourly' точно совпадает с именем,
# заданным в настройках Cron Jobs репозитория в Woodpecker.
# Синтаксис может немного отличаться в зависимости от версии Woodpecker,
# это один из распространенных вариантов:
cron:
include:
- sync-hourly # Указываем имя cron-задания здесь
# Определяем шаги пайплайна
steps:
- name: sync_releases # Имя шага
image: alpine/git
# УБИРАЕМ устаревший ключ 'secrets:' отсюда
environment:
# Определяем переменные окружения и связываем их с секретами
GITEA_TOKEN:
from_secret: gitea_token # Переменная GITEA_TOKEN получит значение из секрета gitea_token
GITHUB_TOKEN:
from_secret: github_token # Переменная GITHUB_TOKEN получит значение из секрета github_token
WOODPECKER_GITEA_URL:
from_secret: gitea_url
# Оставляем другие нужные переменные окружения
REPO_LIST_FILE: repos_to_sync.txt
# GITEA_URL по-прежнему ожидается из окружения агента (WOODPECKER_GITEA_URL)
commands:
# 1. Установка зависимостей
- apk update && apk add curl jq bash
# 2. Запуск скрипта синхронизации (сам скрипт остается без изменений)
# Скрипт будет использовать переменные GITEA_TOKEN и GITHUB_TOKEN из окружения
- |
#!/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}" # Берем из окружения агента
# Проверки переменных (GITEA_TOKEN и GITHUB_TOKEN теперь должны быть в окружении благодаря from_secret)
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 was not injected from secret!"; 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: $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."