FIX PUSH REPO

This commit is contained in:
2026-10-26 23:56:22 +03:00
parent 9eb4a81d8a
commit 443a6c80f8
+75 -32
View File
@@ -1,41 +1,84 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail set -euo pipefail
: "${NEXSPENCE_URL:?Set Gitea secret NEXSPENCE_URL}" # Переменные окружения должны быть установлены пайплайном:
: "${NEXSPENCE_TOKEN:?Set Gitea secret NEXSPENCE_TOKEN}" # NEXSPENCE_URL, NEXSPENCE_TOKEN, NEXSPENCE_REPOSITORY
: "${NEXSPENCE_REPOSITORY:=noko-arch}"
pkg="$(cat .package-path)" if [[ -z "${NEXSPENCE_URL:-}" || -z "${NEXSPENCE_TOKEN:-}" || -z "${NEXSPENCE_REPOSITORY:-}" ]]; then
[[ -f "$pkg" ]] || { echo "Package not found: $pkg" >&2; exit 1; } echo "❌ Ошибка: Не все переменные окружения (NEXSPENCE_URL, NEXSPENCE_TOKEN, NEXSPENCE_REPOSITORY) установлены!"
exit 1
fi
repo_name="$NEXSPENCE_REPOSITORY" # Имя базы данных репозитория (исправляем расширение на стандартное .db.tar.gz для repo-add)
base="${NEXSPENCE_URL%/}/repository/${repo_name}/x86_64" DB_NAME="${NEXSPENCE_REPOSITORY}.db.tar.gz"
tmp="$(mktemp -d)" FILES_NAME="${NEXSPENCE_REPOSITORY}.files.tar.gz"
trap 'rm -rf "$tmp"' EXIT
cp "$pkg" "$tmp/"
pkg_file="$(basename "$pkg")"
# Raw hosted storage does not preserve repo-add symlinks, so upload both echo "====== Подготовка рабочего пространства ======"
# compressed and uncompressed database files as real objects. # Ищем собранный пакет в текущей папке или подпапках
repo-add --remove "$tmp/${repo_name}.db.tar.zst" "$tmp/$pkg_file" PKG_FILE=$(find . -maxdepth 2 -name "*.pkg.tar.zst" | head -n 1)
repo-add --remove "$tmp/${repo_name}.files.tar.zst" "$tmp/$pkg_file" if [[ -z "$PKG_FILE" ]]; then
zstd -q -d -c "$tmp/${repo_name}.db.tar.zst" > "$tmp/${repo_name}.db" echo "❌ Ошибка: Скомпилированный пакет .pkg.tar.zst не найден!"
zstd -q -d -c "$tmp/${repo_name}.files.tar.zst" > "$tmp/${repo_name}.files" exit 1
fi
echo "Найден новый пакет: $PKG_FILE"
upload() { # Создаем изолированную директорию для синхронизации базы данных
local file="$1" BUILD_DIR=$(mktemp -d)
local remote="$base/$(basename "$file")" trap 'rm -rf "$BUILD_DIR"' EXIT
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"
}
upload "$tmp/$pkg_file" cp "$PKG_FILE" "$BUILD_DIR/"
upload "$tmp/${repo_name}.db" cd "$BUILD_DIR"
upload "$tmp/${repo_name}.db.tar.zst"
upload "$tmp/${repo_name}.files"
upload "$tmp/${repo_name}.files.tar.zst"
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 "✅ Публикация успешно завершена! История версий сохранена."