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` во
|
Зависимости резолвятся против **пустой** rpm-базы (`rpm --initdb` во
|
||||||
|
|||||||
+31
-3
@@ -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
|
||||||
|
echo "Скачивание пакета и зависимостей: $pkg" >&2
|
||||||
|
if ! apt-get \
|
||||||
-o RPM::RootDir="$FAKEROOT" \
|
-o RPM::RootDir="$FAKEROOT" \
|
||||||
-o Dir::Cache::Archives="$ARCHIVES" \
|
-o Dir::Cache::Archives="$ARCHIVES" \
|
||||||
-y -d install "${PACKAGES[@]}"
|
-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
|
||||||
|
|||||||
Reference in New Issue
Block a user