All checks were successful
ci/woodpecker/cron/sync-releases Pipeline was successful
67 lines
7.1 KiB
Markdown
67 lines
7.1 KiB
Markdown
# Синхронизация Релизов 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` при скачивании или загрузке. |