Build each package in an isolated container
This commit is contained in:
7 files changed
+361
-131
No files matched your search
@@ -226,17 +226,24 @@ else
|
||||
build_docker_image "$BUILD_DIR" "$ARCH" "$MIRROR"
|
||||
fi
|
||||
|
||||
print_info "Running package build..."
|
||||
print_info "Planning isolated package builds..."
|
||||
|
||||
# Create output directories if they don't exist
|
||||
mkdir -p "$BUILD_OUTPUT_DIR"
|
||||
mkdir -p "$REPO_DIR"
|
||||
|
||||
# Share downloaded archives, never /var/lib/pacman or an installed root.
|
||||
# Channel/architecture separation preserves each mirror's dependency set.
|
||||
PACKAGE_CACHE_DIR="$BUILD_ROOT/cache/pacman/$MIRROR/$ARCH"
|
||||
mkdir -p "$PACKAGE_CACHE_DIR"
|
||||
PLAN_DIR=$(mktemp -d "$SRC_DIR/build-plan.XXXXXX")
|
||||
trap 'rm -rf "$PLAN_DIR"' EXIT
|
||||
|
||||
# Rootful Docker writes as the image uid, so retain its existing permission
|
||||
# workaround. Rootless Podman uses keep-id and must leave ownership/modes alone.
|
||||
if [[ "$CONTAINER_ENGINE" == "docker" ]]; then
|
||||
make_dir_writable "$BUILD_OUTPUT_DIR"
|
||||
make_dir_writable "$REPO_DIR"
|
||||
make_dir_writable "$PLAN_DIR"
|
||||
fi
|
||||
|
||||
# Build Docker arguments
|
||||
@@ -247,8 +254,11 @@ DOCKER_ARGS=(
|
||||
-e PACKAGES="$PACKAGES"
|
||||
-e OMARCHY_RC_PINS="${OMARCHY_RC_PINS:-}"
|
||||
-e DEFER_RUNTIME_DEPS="$DEFER_RUNTIME_DEPS"
|
||||
-e BUILD_PLAN_DIR=/build-plan
|
||||
-v "$PLAN_DIR:/build-plan"
|
||||
-v "$PACKAGE_CACHE_DIR:/var/cache/pacman/pkg"
|
||||
-v "$BUILD_ROOT/build-output:/build-output"
|
||||
-v "$REPO_ROOT:/pkgs.omarchy.org"
|
||||
-v "$REPO_ROOT:/pkgs.omarchy.org:ro"
|
||||
-v "$BUILD_DIR:/build:ro"
|
||||
-v "$BUILD_ROOT/helpers:/helpers:ro"
|
||||
-v "$BUILD_ROOT/pkgbuilds:/pkgbuilds:ro"
|
||||
@@ -260,18 +270,67 @@ if [[ "$CONTAINER_ENGINE" == "podman" ]]; then
|
||||
DOCKER_ARGS+=(-v "$SRC_DIR:/src")
|
||||
fi
|
||||
|
||||
# Run the builder with assembled args
|
||||
# Plan once against the published database, then keep that order throughout
|
||||
# the run. Each package sees the staged artifacts but starts with a fresh
|
||||
# pacman database and root filesystem, even after a failed build.
|
||||
PLATFORM_ARG=$(get_platform_arg "$ARCH")
|
||||
|
||||
"$CONTAINER_ENGINE" run "${CONTAINER_RUN_ARGS[@]}" "$PLATFORM_ARG" "${DOCKER_ARGS[@]}" "$IMAGE_TAG" /build/build.sh
|
||||
"$CONTAINER_ENGINE" run "${CONTAINER_RUN_ARGS[@]}" "$PLATFORM_ARG" "${DOCKER_ARGS[@]}" \
|
||||
-e DRY_RUN=true "$IMAGE_TAG" /build/build.sh
|
||||
|
||||
BUILD_RESULT=$?
|
||||
mapfile -t ORDERED_PACKAGES < "$PLAN_DIR/packages"
|
||||
mapfile -t SKIPPED_PACKAGES < "$PLAN_DIR/skipped"
|
||||
SUCCESSFUL_PACKAGES=()
|
||||
FAILED_PACKAGES=()
|
||||
BLOCKED_PACKAGES=()
|
||||
declare -A BUILD_STATUS=()
|
||||
|
||||
for package in "${ORDERED_PACKAGES[@]}"; do
|
||||
blocked_by=""
|
||||
while read -r consumer dependency; do
|
||||
if [[ "$consumer" == "$package" && "${BUILD_STATUS[$dependency]:-}" != success ]]; then
|
||||
blocked_by="$dependency"
|
||||
break
|
||||
fi
|
||||
done < "$PLAN_DIR/dependencies"
|
||||
|
||||
if [[ -n "$blocked_by" ]]; then
|
||||
print_warning "$package blocked by unsuccessful dependency: $blocked_by"
|
||||
BUILD_STATUS[$package]=blocked
|
||||
BLOCKED_PACKAGES+=("$package")
|
||||
continue
|
||||
fi
|
||||
|
||||
print_info "Building $package in a fresh container..."
|
||||
if "$CONTAINER_ENGINE" run "${CONTAINER_RUN_ARGS[@]}" "$PLATFORM_ARG" "${DOCKER_ARGS[@]}" \
|
||||
-e BUILD_PACKAGE="$package" "$IMAGE_TAG" /build/build.sh; then
|
||||
BUILD_STATUS[$package]=success
|
||||
SUCCESSFUL_PACKAGES+=("$package")
|
||||
else
|
||||
BUILD_STATUS[$package]=failed
|
||||
FAILED_PACKAGES+=("$package")
|
||||
fi
|
||||
done
|
||||
|
||||
# Summary
|
||||
echo ""
|
||||
if [[ $BUILD_RESULT -eq 0 ]]; then
|
||||
print_success "Build completed successfully!"
|
||||
else
|
||||
print_header "Build Summary"
|
||||
echo " Total packages: ${#ORDERED_PACKAGES[@]}"
|
||||
echo " Built: ${#SUCCESSFUL_PACKAGES[@]}"
|
||||
echo " Skipped: ${#SKIPPED_PACKAGES[@]} (up-to-date or excluded)"
|
||||
echo " Failed: ${#FAILED_PACKAGES[@]}"
|
||||
echo " Blocked: ${#BLOCKED_PACKAGES[@]}"
|
||||
|
||||
if (( ${#FAILED_PACKAGES[@]} + ${#BLOCKED_PACKAGES[@]} )); then
|
||||
if (( ${#FAILED_PACKAGES[@]} )); then
|
||||
echo "Failed packages:"
|
||||
printf ' - %s\n' "${FAILED_PACKAGES[@]}"
|
||||
fi
|
||||
if (( ${#BLOCKED_PACKAGES[@]} )); then
|
||||
echo "Packages blocked by failed dependencies:"
|
||||
printf ' - %s\n' "${BLOCKED_PACKAGES[@]}"
|
||||
fi
|
||||
print_warning "Some packages failed (see details above)"
|
||||
exit $BUILD_RESULT
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_success "Build completed successfully!"
|
||||
Reference in new issue
Block a user