mirror of
https://github.com/Cheviiot/Nivora.git
synced 2026-08-03 15:51:12 +00:00
feat: create autonomous Nivora package repository
Maintain a validated cross-distribution package catalog. Automate upstream updates, isolated builds, diagnostics, and direct publication. Build the official GitHub Desktop sources for Linux with working OAuth.
This commit is contained in:
Executable
+130
@@ -0,0 +1,130 @@
|
||||
#!/bin/bash
|
||||
set -euo pipefail
|
||||
|
||||
script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
repo_root="$(cd "${script_dir}/.." && pwd)"
|
||||
# shellcheck source=tools/lib/source_cache.sh
|
||||
source "${script_dir}/lib/source_cache.sh"
|
||||
cd "$repo_root"
|
||||
|
||||
mapfile -t all_packages < <(
|
||||
for staplerfile in */Staplerfile; do
|
||||
dirname "$staplerfile"
|
||||
done | sort
|
||||
)
|
||||
|
||||
is_package() {
|
||||
local requested="$1"
|
||||
local package
|
||||
for package in "${all_packages[@]}"; do
|
||||
[[ "$requested" == "$package" ]] && return 0
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
packages=()
|
||||
if [[ "${1:-}" == '--all' ]]; then
|
||||
packages=("${all_packages[@]}")
|
||||
shift
|
||||
else
|
||||
packages=("$@")
|
||||
fi
|
||||
|
||||
[[ "${#packages[@]}" -gt 0 ]] || {
|
||||
echo 'Usage: tools/clean_build.sh {--all|package...}' >&2
|
||||
exit 2
|
||||
}
|
||||
|
||||
for package in "${packages[@]}"; do
|
||||
is_package "$package" || {
|
||||
echo "Unknown package: ${package}" >&2
|
||||
exit 2
|
||||
}
|
||||
done
|
||||
|
||||
if command -v podman >/dev/null 2>&1; then
|
||||
engine=podman
|
||||
elif command -v docker >/dev/null 2>&1; then
|
||||
engine=docker
|
||||
else
|
||||
echo 'clean-build requires stplr-spec with clean-build, Podman or Docker' >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
readonly image='registry.altlinux.org/sisyphus/base:latest'
|
||||
readonly cache_volume="nivora-clean-build-cache-$$"
|
||||
readonly builder_image="nivora-clean-build:$$"
|
||||
builder_dir="$(mktemp -d)"
|
||||
docker_config=''
|
||||
source_cache="${NIVORA_SOURCE_CACHE:-${XDG_CACHE_HOME:-${HOME}/.cache}/stplr/dl}"
|
||||
|
||||
cleanup() {
|
||||
"$engine" volume rm "$cache_volume" >/dev/null 2>&1 || true
|
||||
"$engine" image rm "$builder_image" >/dev/null 2>&1 || true
|
||||
find "$builder_dir" -mindepth 1 -delete
|
||||
rmdir "$builder_dir"
|
||||
if [[ -n "$docker_config" ]]; then
|
||||
find "$docker_config" -mindepth 1 -delete
|
||||
rmdir "$docker_config"
|
||||
fi
|
||||
}
|
||||
trap cleanup EXIT
|
||||
|
||||
if [[ "$engine" == docker ]]; then
|
||||
docker_config="$(mktemp -d)"
|
||||
printf '{}\n' >"${docker_config}/config.json"
|
||||
export DOCKER_CONFIG="$docker_config"
|
||||
fi
|
||||
|
||||
cat >"${builder_dir}/Containerfile" <<EOF
|
||||
FROM ${image}
|
||||
RUN for attempt in 1 2 3; do \
|
||||
apt-get update \
|
||||
&& apt-get dist-upgrade -y \
|
||||
&& apt-get install -y ca-certificates stplr binutils python3 \
|
||||
&& exit 0; \
|
||||
sleep 5; \
|
||||
done; \
|
||||
exit 1
|
||||
EOF
|
||||
|
||||
pulled=0
|
||||
for attempt in 1 2 3; do
|
||||
if "$engine" pull "$image"; then
|
||||
pulled=1
|
||||
break
|
||||
fi
|
||||
sleep "$((attempt * 5))"
|
||||
done
|
||||
[[ "$pulled" -eq 1 ]] || exit 1
|
||||
"$engine" volume create "$cache_volume" >/dev/null
|
||||
"$engine" build -t "$builder_image" -f "${builder_dir}/Containerfile" "$builder_dir"
|
||||
|
||||
import_stplr_source_cache \
|
||||
"$engine" "$builder_image" "$cache_volume" "$builder_dir" "$source_cache" \
|
||||
"${packages[@]}"
|
||||
|
||||
for package in "${packages[@]}"; do
|
||||
echo "==> clean-build ${package} (${engine})"
|
||||
find "$package" -maxdepth 1 -type f \
|
||||
\( -name '*.rpm' -o -name '*.deb' -o -name '*.apk' -o -name '*.pkg.tar.*' \) \
|
||||
-delete
|
||||
built=0
|
||||
for attempt in 1 2; do
|
||||
if "$engine" run --rm --privileged \
|
||||
-e TERM=xterm-256color \
|
||||
-v "${repo_root}/${package}:/app" \
|
||||
-v "${cache_volume}:/var/cache/stplr" \
|
||||
-w /app \
|
||||
"$builder_image" \
|
||||
stplr --interactive=false build --clean -s Staplerfile; then
|
||||
built=1
|
||||
break
|
||||
fi
|
||||
echo "==> retry ${package} (${attempt}/2)" >&2
|
||||
sleep "$((attempt * 5))"
|
||||
done
|
||||
[[ "$built" -eq 1 ]] || exit 1
|
||||
done
|
||||
|
||||
echo "OK: clean-build завершён для ${#packages[@]} пакетов"
|
||||
Reference in New Issue
Block a user