# Синхронизация Релизов GitHub -> Gitea Этот репозиторий содержит скрипт и конфигурацию пайплайна Woodpecker CI для автоматической синхронизации метаданных релизов (описание, статус pre-release, ассеты) из публичных репозиториев GitHub в их зеркала на вашем экземпляре Gitea. **Важно:** Этот скрипт **не** выполняет зеркалирование самого Git-репозитория (коммитов, веток). Он предполагает, что у вас уже настроено зеркалирование Git-репозиториев средствами Gitea. Скрипт лишь добавляет синхронизацию раздела "Релизы". ## Как это работает 1. **Триггер:** Cron-задание в Woodpecker запускает пайплайн по расписанию (например, каждый час). 2. **Выполнение:** * Пайплайн запускается в Docker-контейнере с предустановленными утилитами (`bash`, `curl`, `jq`). * Запускается основной скрипт `sync-releases.sh`. 3. **Скрипт:** * Читает список репозиториев для синхронизации из файла `repos_to_sync.txt`. * Для каждой пары "GitHub репозиторий -> Gitea зеркало": * Запрашивает существующие релизы из Gitea API (по тегам). * Запрашивает последние релизы из GitHub API. * Сравнивает списки: если релиз из GitHub отсутствует в Gitea (по тегу), он считается новым. * **Создание релиза:** Для нового релиза отправляет запрос к Gitea API для создания релиза с соответствующим тегом, именем, описанием и статусом pre-release. * **Скачивание ассетов:** Скачивает все пользовательские ассеты релиза с GitHub. * **Загрузка ассетов:** Загружает скачанные ассеты в только что созданный релиз Gitea с их оригинальными именами. ## Требования * Работающий экземпляр Gitea. * Работающий экземпляр Woodpecker CI, подключенный к вашему Gitea. * **Gitea API Token:** Сгенерированный токен пользователя Gitea. Токен должен иметь права на: * Чтение репозиториев (`repository` или `repo` -> `read`). * Создание релизов и загрузку вложений (`repository` или `repo` -> `release` или `write:release`). * **GitHub Personal Access Token (PAT) (Рекомендуется):** Хотя скрипт работает с публичными репозиториями, PAT сильно увеличивает лимиты запросов к GitHub API. Создайте токен [здесь](https://github.com/settings/tokens) (достаточно "Token (classic)" без scope или только с `public_repo`). * Настроенное зеркалирование Git-репозиториев из GitHub в Gitea (средствами Gitea). ## Настройка 1. **Клонируйте репозиторий** или разместите файлы `.woodpecker/sync-releases.yml`, `.woodpecker/sync-releases.sh` и `repos_to_sync.txt` в вашем репозитории, который управляется Woodpecker. 2. **Настройте Секреты в Woodpecker:** * Перейдите в Настройки репозитория в интерфейсе Woodpecker -> Secrets. * Создайте следующие секреты: * `GITEA_URL`: Полный URL вашего Gitea (например, `https://gitea.example.com`). * `GITEA_TOKEN`: Ваш Gitea API Token с нужными правами. * `GITHUB_TOKEN`: Ваш GitHub PAT (рекомендуется). 3. **Настройте Список Репозиториев:** * Отредактируйте файл `repos_to_sync.txt`. * Добавьте пары репозиториев, которые нужно синхронизировать, следуя инструкциям внутри файла. 4. **Создайте Cron Job в Woodpecker:** * Перейдите в Настройки репозитория -> Cron Jobs. * Создайте новое задание: * **Name:** `sync-hourly` (или другое имя, но оно должно совпадать с `when.cron.include` в `.woodpecker/sync-releases.yml`). * **Branch:** `main` (или ваша основная ветка). * **Schedule:** `0 * * * *` или `@every 1h` (для запуска каждый час) или другое расписание в формате [cron](https://pkg.go.dev/github.com/gdgvda/cron#hdr-CRON_Expression_Format). * Сохраните задание. 5. **Проверьте Доступ к Сети:** Убедитесь, что ваши агенты Woodpecker могут обращаться к вашему `GITEA_URL` и к `https://api.github.com` и в принципе КОРРЕКТНО НАСТРОЕНЫ для работы в паре. ## Файлы * `.woodpecker/sync-releases.yml`: Определение пайплайна Woodpecker. Задает триггер (cron), образ Docker, переменные окружения (включая секреты) и запускает скрипт. * `.woodpecker/sync-releases.sh`: Основной bash-скрипт, выполняющий логику синхронизации. * `repos_to_sync.txt`: Список пар репозиториев для синхронизации. ## Устранение Неполадок * **Релизы не создаются:** Проверьте логи пайплайна в Woodpecker. * Убедитесь, что Git-теги успешно синхронизированы зеркалом Gitea. * Проверьте права токена Gitea. * Включите `set -x` в начале `sync-releases.sh` для детальной трассировки и изучите вывод `curl`. * **Ошибка GitHub fetch/Bad credentials:** Проверьте валидность и срок действия вашего `GITHUB_TOKEN`. * **Ассеты не загружаются:** Проверьте права токена Gitea (нужен доступ на запись к релизам/вложениям). Проверьте логи на ошибки `curl` при скачивании или загрузке.