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` во
+33 -5
View File
@@ -25,6 +25,14 @@ usage() {
Повторные запуски с другим набором пакетов дополняют существующий
каталог репозитория, не скачивая заново уже имеющиеся пакеты.
Если часть пакетов не удалось скачать, остальные всё равно собираются
в репозиторий/архив; список пропущенных выводится предупреждением.
Коды возврата:
0 — все пакеты скачаны успешно
1 — фатальная ошибка (ничего не скачано и т.п.)
2 — репозиторий/архив собраны, но часть пакетов пропущена
Пример:
sudo $SCRIPT_NAME -o /srv/offline-repo -a bash mc htop
EOF
@@ -85,11 +93,17 @@ if [[ ! -d "$FAKEROOT/var/lib/rpm" ]]; then
rpm --root="$FAKEROOT" --initdb
fi
echo "Скачивание пакетов и зависимостей: ${PACKAGES[*]}" >&2
apt-get \
-o RPM::RootDir="$FAKEROOT" \
-o Dir::Cache::Archives="$ARCHIVES" \
-y -d install "${PACKAGES[@]}"
FAILED_PACKAGES=()
for pkg in "${PACKAGES[@]}"; do
echo "Скачивание пакета и зависимостей: $pkg" >&2
if ! apt-get \
-o RPM::RootDir="$FAKEROOT" \
-o Dir::Cache::Archives="$ARCHIVES" \
-y -d install "$pkg"; then
echo "ПРЕДУПРЕЖДЕНИЕ: не удалось скачать '$pkg' — пропускаю, продолжаю с остальными" >&2
FAILED_PACKAGES+=("$pkg")
fi
done
echo "Раскладка пакетов по архитектурам..." >&2
shopt -s nullglob
@@ -103,6 +117,14 @@ for rpmfile in "$ARCHIVES"/*.rpm; do
done
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
[[ -d "$archdir" ]] || continue
arch=$(basename "$(dirname "$archdir")")
@@ -175,3 +197,9 @@ echo "Инструкция: $README"
if [[ -n "$ARCHIVE_PATH" ]]; then
echo "Архив: $ARCHIVE_PATH"
fi
if [[ ${#FAILED_PACKAGES[@]} -gt 0 ]]; then
echo
echo "ПРЕДУПРЕЖДЕНИЕ: не скачаны ${#FAILED_PACKAGES[@]} пакет(ов): ${FAILED_PACKAGES[*]}"
exit 2
fi