#!/bin/bash # Build packages locally, then publish them from the build host. # # The two halves of shipping a package built on a local machine: bin/build # produces the artifacts, bin/push-build hands them to the host that owns the # signing key and the complete repository. set -e SCRIPT_DIR=$(realpath "${BASH_SOURCE[0]%/*}") BUILD_ROOT=$(realpath "$SCRIPT_DIR/..") source "$BUILD_ROOT/helpers/message-helpers.sh" source "$BUILD_ROOT/helpers/paths.sh" PACKAGES=() PACKAGE_FLAG_GIVEN=false HOST="" REMOTE_ROOT="" DRY_RUN=false ASSUME_YES=false print_header "Deploy (build + push)" while [[ $# -gt 0 ]]; do case $1 in --arch) ARCH="$2" update_arch_paths shift 2 ;; --mirror) MIRROR="$2" if [[ "$MIRROR" != "edge" && "$MIRROR" != "stable" ]]; then print_error "Invalid mirror: $MIRROR (must be 'edge' or 'stable')" exit 1 fi update_arch_paths shift 2 ;; --package) shift PACKAGE_FLAG_GIVEN=true while [[ $# -gt 0 && ! "$1" =~ ^-- ]]; do [[ -n "$1" ]] && PACKAGES+=("$1") shift done ;; --host) HOST="$2" shift 2 ;; --remote-root) REMOTE_ROOT="$2" shift 2 ;; --dry-run) DRY_RUN=true shift ;; -y | --yes) ASSUME_YES=true shift ;; -h | --help) echo "Usage: $0 [OPTIONS]" echo "" echo "Build packages here, then publish them from the build host." echo "" echo "Options:" echo " --arch Target architecture (default: x86_64)" echo " --mirror Mirror to publish to (edge or stable, default: edge)" echo " --package Build and push only these packages (space-separated)" echo " --host ssh destination (default: \$OMARCHY_BUILD_HOST or .build-host)" echo " --remote-root Repository path on the host (default: /root/omarchy-pkgs)" echo " --dry-run Show the plan, build nothing and transfer nothing" echo " -y, --yes Do not ask for confirmation before publishing" echo " -h, --help Show this help message" echo "" echo "Examples:" echo " $0 --package nvidia-580xx-utils" echo " $0 --package nvidia-580xx-utils --host root@example.com" exit 0 ;; *) print_error "Unknown option: $1" exit 1 ;; esac done if [[ "$PACKAGE_FLAG_GIVEN" == true && ${#PACKAGES[@]} -eq 0 ]]; then print_error "--package requires at least one package name" exit 1 fi echo "" print_info "This will:" echo " 1. Build packages locally" echo " 2. Upload them to the build host" echo " 3. Sign, promote, update and sync them there" echo "" BUILD_ARGS=("--arch" "$ARCH" "--mirror" "$MIRROR") PUSH_ARGS=("--arch" "$ARCH" "--mirror" "$MIRROR") if [[ ${#PACKAGES[@]} -gt 0 ]]; then BUILD_ARGS+=("--package" "${PACKAGES[@]}") PUSH_ARGS+=("--package" "${PACKAGES[@]}") fi [[ -n "$HOST" ]] && PUSH_ARGS+=("--host" "$HOST") [[ -n "$REMOTE_ROOT" ]] && PUSH_ARGS+=("--remote-root" "$REMOTE_ROOT") [[ "$DRY_RUN" == true ]] && BUILD_ARGS+=("--dry-run") && PUSH_ARGS+=("--dry-run") [[ "$ASSUME_YES" == true ]] && PUSH_ARGS+=("--yes") # Resolve the host before spending build time on packages that cannot ship. if [[ "$DRY_RUN" != true ]]; then resolved_host="$HOST" if [[ -z "$resolved_host" ]]; then resolved_host="${OMARCHY_BUILD_HOST:-}" [[ -z "$resolved_host" && -f "$BUILD_ROOT/.build-host" ]] && resolved_host=$(<"$BUILD_ROOT/.build-host") fi if [[ -z "$resolved_host" ]]; then print_error "No build host configured" echo "" echo "Pass --host, set OMARCHY_BUILD_HOST, or write the destination to:" echo " $BUILD_ROOT/.build-host" exit 1 fi fi print_info "Step 1/2: Building..." echo "" "$SCRIPT_DIR/build" "${BUILD_ARGS[@]}" echo "" print_info "Step 2/2: Pushing to the build host..." echo "" "$SCRIPT_DIR/push-build" "${PUSH_ARGS[@]}"