Don't abort the whole build if some packages fail to download

Download packages one at a time instead of a single batch apt-get call,
so a typo'd or unavailable package name (or a transient network error on
one package) no longer aborts the entire run. Failed packages are
collected, printed as a warning, and the repo/archive are still built
from whatever succeeded.

Exit codes: 0 = all packages downloaded, 1 = fatal (nothing downloaded
at all), 2 = repo/archive built but some packages were skipped.

Verified manually against the ALT SP Server test machine.
This commit is contained in:
2026-09-25 18:09:02 +03:00
parent 929939341c
commit 98b1d44671
2 changed files with 42 additions and 5 deletions
+9
View File
@@ -37,6 +37,15 @@ sudo ./altsp-download-repo.sh -o /srv/offline-repo -a bash mc htop
Повторные запуски с другим набором пакетов дополняют существующий каталог Повторные запуски с другим набором пакетов дополняют существующий каталог
репозитория, не скачивая заново уже имеющиеся пакеты. репозитория, не скачивая заново уже имеющиеся пакеты.
Если часть пакетов не удалось скачать (опечатка в имени, пакет отсутствует
в репозитории, сетевой сбой), скрипт выводит предупреждение по каждому
такому пакету, но всё равно собирает репозиторий/архив из того, что
удалось скачать. Коды возврата:
- `0` — все пакеты скачаны успешно;
- `1` — фатальная ошибка (например, не скачался вообще ни один пакет);
- `2` — репозиторий/архив собраны, но часть пакетов пропущена.
## Как это работает ## Как это работает
Зависимости резолвятся против **пустой** rpm-базы (`rpm --initdb` во Зависимости резолвятся против **пустой** rpm-базы (`rpm --initdb` во
+33 -5
View File
@@ -25,6 +25,14 @@ usage() {
Повторные запуски с другим набором пакетов дополняют существующий Повторные запуски с другим набором пакетов дополняют существующий
каталог репозитория, не скачивая заново уже имеющиеся пакеты. каталог репозитория, не скачивая заново уже имеющиеся пакеты.
Если часть пакетов не удалось скачать, остальные всё равно собираются
в репозиторий/архив; список пропущенных выводится предупреждением.
Коды возврата:
0 — все пакеты скачаны успешно
1 — фатальная ошибка (ничего не скачано и т.п.)
2 — репозиторий/архив собраны, но часть пакетов пропущена
Пример: Пример:
sudo $SCRIPT_NAME -o /srv/offline-repo -a bash mc htop sudo $SCRIPT_NAME -o /srv/offline-repo -a bash mc htop
EOF EOF
@@ -85,11 +93,17 @@ if [[ ! -d "$FAKEROOT/var/lib/rpm" ]]; then
rpm --root="$FAKEROOT" --initdb rpm --root="$FAKEROOT" --initdb
fi fi
echo "Скачивание пакетов и зависимостей: ${PACKAGES[*]}" >&2 FAILED_PACKAGES=()
apt-get \ for pkg in "${PACKAGES[@]}"; do
-o RPM::RootDir="$FAKEROOT" \ echo "Скачивание пакета и зависимостей: $pkg" >&2
-o Dir::Cache::Archives="$ARCHIVES" \ if ! apt-get \
-y -d install "${PACKAGES[@]}" -o RPM::RootDir="$FAKEROOT" \
-o Dir::Cache::Archives="$ARCHIVES" \
-y -d install "$pkg"; then
echo "ПРЕДУПРЕЖДЕНИЕ: не удалось скачать '$pkg' — пропускаю, продолжаю с остальными" >&2
FAILED_PACKAGES+=("$pkg")
fi
done
echo "Раскладка пакетов по архитектурам..." >&2 echo "Раскладка пакетов по архитектурам..." >&2
shopt -s nullglob shopt -s nullglob
@@ -103,6 +117,14 @@ for rpmfile in "$ARCHIVES"/*.rpm; do
done done
shopt -u nullglob shopt -u nullglob
shopt -s nullglob
arch_dirs=("$OUTDIR"/*/RPMS.classic)
shopt -u nullglob
if [[ ${#arch_dirs[@]} -eq 0 ]]; then
echo "Ошибка: ни один пакет не был успешно скачан (${FAILED_PACKAGES[*]})." >&2
exit 1
fi
for archdir in "$OUTDIR"/*/RPMS.classic; do for archdir in "$OUTDIR"/*/RPMS.classic; do
[[ -d "$archdir" ]] || continue [[ -d "$archdir" ]] || continue
arch=$(basename "$(dirname "$archdir")") arch=$(basename "$(dirname "$archdir")")
@@ -175,3 +197,9 @@ echo "Инструкция: $README"
if [[ -n "$ARCHIVE_PATH" ]]; then if [[ -n "$ARCHIVE_PATH" ]]; then
echo "Архив: $ARCHIVE_PATH" echo "Архив: $ARCHIVE_PATH"
fi fi
if [[ ${#FAILED_PACKAGES[@]} -gt 0 ]]; then
echo
echo "ПРЕДУПРЕЖДЕНИЕ: не скачаны ${#FAILED_PACKAGES[@]} пакет(ов): ${FAILED_PACKAGES[*]}"
exit 2
fi