#!/usr/bin/env bash set -euo pipefail # Переменные окружения должны быть установлены пайплайном: # NEXSPENCE_URL, NEXSPENCE_TOKEN, NEXSPENCE_REPOSITORY if [[ -z "${NEXSPENCE_URL:-}" || -z "${NEXSPENCE_TOKEN:-}" || -z "${NEXSPENCE_REPOSITORY:-}" ]]; then echo "❌ Ошибка: Не все переменные окружения (NEXSPENCE_URL, NEXSPENCE_TOKEN, NEXSPENCE_REPOSITORY) установлены!" exit 1 fi # Имя базы данных репозитория (исправляем расширение на стандартное .db.tar.gz для repo-add) DB_NAME="${NEXSPENCE_REPOSITORY}.db.tar.gz" FILES_NAME="${NEXSPENCE_REPOSITORY}.files.tar.gz" echo "====== Подготовка рабочего пространства ======" # Ищем собранный пакет в текущей папке или подпапках PKG_FILE=$(find . -maxdepth 2 -name "*.pkg.tar.zst" | head -n 1) if [[ -z "$PKG_FILE" ]]; then echo "❌ Ошибка: Скомпилированный пакет .pkg.tar.zst не найден!" exit 1 fi echo "Найден новый пакет: $PKG_FILE" # Создаем изолированную директорию для синхронизации базы данных BUILD_DIR=$(mktemp -d) trap 'rm -rf "$BUILD_DIR"' EXIT cp "$PKG_FILE" "$BUILD_DIR/" cd "$BUILD_DIR" echo "====== Загрузка существующей базы данных ======" # Пытаемся скачать текущую базу данных с Nexspence, чтобы сохранить историю прошлых версий # Если репозиторий пустой (первый запуск), curl может вернуть 404, это нормально curl --fail --silent --show-error --location \ -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" \ "${NEXSPENCE_URL}/repository/${NEXSPENCE_REPOSITORY}/${DB_NAME}" -o "$DB_NAME" || echo "База данных не найдена на сервере, будет создана новая." if [[ -f "$DB_NAME" ]]; then echo "Успешно загружена существующая база данных. Прошлые версии будут сохранены в индексе." # Скачиваем также сопутствующий .files файл для консистентности индексов curl --fail --silent --location \ -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" \ "${NEXSPENCE_URL}/repository/${NEXSPENCE_REPOSITORY}/${FILES_NAME}" -o "$FILES_NAME" || true fi echo "====== Обновление базы данных через repo-add ======" # Добавляем новый пакет в базу данных. # Флаг -n (new-only) гарантирует, что старые версии этого же пакета НЕ будут вычищаться из индексов базы данных. repo-add -n "$DB_NAME" *.pkg.tar.zst echo "====== Публикация файлов на Nexspence ======" # Отправляем новый пакет (файлы старых версий лежат на Nexspence под своими уникальными версиями, они не затрутся) NEW_PKG_NAME=$(basename *.pkg.tar.zst) echo "Загрузка пакета: $NEW_PKG_NAME..." curl --fail --silent --show-error -X PUT \ -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" \ --data-binary @"$NEW_PKG_NAME" \ "${NEXSPENCE_URL}/repository/${NEXSPENCE_REPOSITORY}/$NEW_PKG_NAME" # Отправляем обновленные файлы базы данных (они перезапишут старые индексы, но теперь внутри содержатся данные всех версий) echo "Загрузка обновленной базы данных: $DB_NAME..." curl --fail --silent --show-error -X PUT \ -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" \ --data-binary @$DB_NAME \ "${NEXSPENCE_URL}/repository/${NEXSPENCE_REPOSITORY}/$DB_NAME" if [[ -f "$FILES_NAME" ]]; then echo "Загрузка обновленного файла структуры: $FILES_NAME..." curl --fail --silent --show-error -X PUT \ -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" \ --data-binary @$FILES_NAME \ "${NEXSPENCE_URL}/repository/${NEXSPENCE_REPOSITORY}/$FILES_NAME" fi # Создаем символические ссылки .db и .files без расширения архива, которые pacman запрашивает по умолчанию ln -sf "$DB_NAME" "${NEXSPENCE_REPOSITORY}.db" ln -sf "$FILES_NAME" "${NEXSPENCE_REPOSITORY}.files" echo "Загрузка прямых алиасов базы данных для pacman..." curl --fail --silent --show-error -X PUT -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" --data-binary @"${NEXSPENCE_REPOSITORY}.db" "${NEXSPENCE_URL}/repository/${NEXSPENCE_REPOSITORY}/${NEXSPENCE_REPOSITORY}.db" curl --fail --silent --show-error -X PUT -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" --data-binary @"${NEXSPENCE_REPOSITORY}.files" "${NEXSPENCE_URL}/repository/${NEXSPENCE_REPOSITORY}/${NEXSPENCE_REPOSITORY}.files" echo "✅ Публикация успешно завершена! История версий сохранена."