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:
@@ -37,6 +37,15 @@ sudo ./altsp-download-repo.sh -o /srv/offline-repo -a bash mc htop
|
||||
Повторные запуски с другим набором пакетов дополняют существующий каталог
|
||||
репозитория, не скачивая заново уже имеющиеся пакеты.
|
||||
|
||||
Если часть пакетов не удалось скачать (опечатка в имени, пакет отсутствует
|
||||
в репозитории, сетевой сбой), скрипт выводит предупреждение по каждому
|
||||
такому пакету, но всё равно собирает репозиторий/архив из того, что
|
||||
удалось скачать. Коды возврата:
|
||||
|
||||
- `0` — все пакеты скачаны успешно;
|
||||
- `1` — фатальная ошибка (например, не скачался вообще ни один пакет);
|
||||
- `2` — репозиторий/архив собраны, но часть пакетов пропущена.
|
||||
|
||||
## Как это работает
|
||||
|
||||
Зависимости резолвятся против **пустой** rpm-базы (`rpm --initdb` во
|
||||
|
||||
+31
-3
@@ -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 \
|
||||
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 "${PACKAGES[@]}"
|
||||
-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
|
||||
|
||||
Reference in New Issue
Block a user