From 443a6c80f82a7b08e570b5cabc0f557eb2acd1c1 Mon Sep 17 00:00:00 2001 From: nokotan Date: Mon, 26 Oct 2026 23:56:22 +0300 Subject: [PATCH] FIX PUSH REPO --- scripts/publish.sh | 107 +++++++++++++++++++++++++++++++-------------- 1 file changed, 75 insertions(+), 32 deletions(-) diff --git a/scripts/publish.sh b/scripts/publish.sh index e9789d4..c342080 100755 --- a/scripts/publish.sh +++ b/scripts/publish.sh @@ -1,41 +1,84 @@ #!/usr/bin/env bash set -euo pipefail -: "${NEXSPENCE_URL:?Set Gitea secret NEXSPENCE_URL}" -: "${NEXSPENCE_TOKEN:?Set Gitea secret NEXSPENCE_TOKEN}" -: "${NEXSPENCE_REPOSITORY:=noko-arch}" +# Переменные окружения должны быть установлены пайплайном: +# NEXSPENCE_URL, NEXSPENCE_TOKEN, NEXSPENCE_REPOSITORY -pkg="$(cat .package-path)" -[[ -f "$pkg" ]] || { echo "Package not found: $pkg" >&2; exit 1; } +if [[ -z "${NEXSPENCE_URL:-}" || -z "${NEXSPENCE_TOKEN:-}" || -z "${NEXSPENCE_REPOSITORY:-}" ]]; then + echo "❌ Ошибка: Не все переменные окружения (NEXSPENCE_URL, NEXSPENCE_TOKEN, NEXSPENCE_REPOSITORY) установлены!" + exit 1 +fi -repo_name="$NEXSPENCE_REPOSITORY" -base="${NEXSPENCE_URL%/}/repository/${repo_name}/x86_64" -tmp="$(mktemp -d)" -trap 'rm -rf "$tmp"' EXIT -cp "$pkg" "$tmp/" -pkg_file="$(basename "$pkg")" +# Имя базы данных репозитория (исправляем расширение на стандартное .db.tar.gz для repo-add) +DB_NAME="${NEXSPENCE_REPOSITORY}.db.tar.gz" +FILES_NAME="${NEXSPENCE_REPOSITORY}.files.tar.gz" -# Raw hosted storage does not preserve repo-add symlinks, so upload both -# compressed and uncompressed database files as real objects. -repo-add --remove "$tmp/${repo_name}.db.tar.zst" "$tmp/$pkg_file" -repo-add --remove "$tmp/${repo_name}.files.tar.zst" "$tmp/$pkg_file" -zstd -q -d -c "$tmp/${repo_name}.db.tar.zst" > "$tmp/${repo_name}.db" -zstd -q -d -c "$tmp/${repo_name}.files.tar.zst" > "$tmp/${repo_name}.files" +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" -upload() { - local file="$1" - local remote="$base/$(basename "$file")" - echo "==> PUT $(basename "$file")" - curl --fail-with-body --retry 5 --retry-all-errors \ - --connect-timeout 20 --max-time 900 \ - -X PUT -H "Authorization: Bearer ${NEXSPENCE_TOKEN}" \ - --upload-file "$file" "$remote" -} +# Создаем изолированную директорию для синхронизации базы данных +BUILD_DIR=$(mktemp -d) +trap 'rm -rf "$BUILD_DIR"' EXIT -upload "$tmp/$pkg_file" -upload "$tmp/${repo_name}.db" -upload "$tmp/${repo_name}.db.tar.zst" -upload "$tmp/${repo_name}.files" -upload "$tmp/${repo_name}.files.tar.zst" +cp "$PKG_FILE" "$BUILD_DIR/" +cd "$BUILD_DIR" -echo "Published package and repository database to $base/" +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 "✅ Публикация успешно завершена! История версий сохранена."