# HG changeset patch # User MrJuneJune # Date 1786132350 25200 # Node ID efaf4c63cc943211be5a20f4951b1a7ad564458c # Parent 056790c4fb0d824e45a4476c5a16953d83938727 fix clean production bundle staging Recreate deployment staging before copying the Bazel bundle and verify required inference runtime paths before promoting it. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> diff -r 056790c4fb0d -r efaf4c63cc94 mrjunejune/deploy.sh --- a/mrjunejune/deploy.sh Fri Aug 07 10:50:30 2026 -0700 +++ b/mrjunejune/deploy.sh Fri Aug 07 12:52:30 2026 -0700 @@ -1,27 +1,57 @@ -#!/bin/bash -bazel build -c opt //mrjunejune:mrjunejune_server_bundle +#!/usr/bin/env bash +set -euo pipefail + +bazel build -c opt //mrjunejune:mrjunejune_server_bundle -# Create -sudo mkdir -p /opt/mrjunejune_server -sudo cp -a bazel-bin/mrjunejune/mrjunejune_server_bundle /opt/mrjunejune_server_bundle_new +bundle="$(realpath bazel-bin/mrjunejune/mrjunejune_server_bundle)" +staging="/opt/mrjunejune_server_bundle_new" +active="/opt/mrjunejune_server_bundle_active" + +# Always create staging from an empty directory. Copying into an existing +# directory nests the bundle and can promote stale/incomplete runtime files. +sudo rm -rf "$staging" +sudo mkdir -p "$staging" +sudo cp -a "$bundle"/. "$staging"/ sudo mv \ - /opt/mrjunejune_server_bundle_new/mrjunejune_server \ - /opt/mrjunejune_server_bundle_new/mrjunejune_server_binary + "$staging/mrjunejune_server" \ + "$staging/mrjunejune_server_binary" sudo cp \ - /opt/mrjunejune_server_bundle_new/mrjunejune/production_entrypoint.sh \ - /opt/mrjunejune_server_bundle_new/mrjunejune_server + "$staging/mrjunejune/production_entrypoint.sh" \ + "$staging/mrjunejune_server" + +required_runtime=( + "$staging/mrjunejune_server" + "$staging/mrjunejune_server_binary" + "$staging/mrjunejune/inference_stack.sh" + "$staging/mrjunejune/inference_sidecar_launcher.sh" + "$staging/mrjunejune/inference/copilot_sidecar.zip" + "$staging/mrjunejune/inference/litellm_proxy.zip" + "$staging/mrjunejune/inference/litellm_config.yaml" + "$staging/+http_archive+copilot_cli_linux_x86_64/copilot" + "$staging/rules_python++python+python_3_11_x86_64-unknown-linux-gnu/bin/python3" +) +for runtime_path in "${required_runtime[@]}"; do + if [[ ! -e "$runtime_path" ]]; then + echo "Deployment bundle is missing runtime: $runtime_path" >&2 + exit 1 + fi +done + sudo chmod +x \ - /opt/mrjunejune_server_bundle_new/mrjunejune_server \ - /opt/mrjunejune_server_bundle_new/mrjunejune/inference_stack.sh \ - /opt/mrjunejune_server_bundle_new/mrjunejune/inference_sidecar_launcher.sh -sudo chown -R mrjunejune_server:zenbu_team /opt/mrjunejune_server_bundle_new -# sqlite3 db + "$staging/mrjunejune_server" \ + "$staging/mrjunejune/inference_stack.sh" \ + "$staging/mrjunejune/inference_sidecar_launcher.sh" \ + "$staging/+http_archive+copilot_cli_linux_x86_64/copilot" +sudo chown -R mrjunejune_server:zenbu_team "$staging" + +# Persistent database, config, and Copilot tokens stay outside the immutable +# bundle and survive swaps. sudo mkdir -p /opt/data/mrjunejune/ sudo chown -R mrjunejune_server:zenbu_team /opt/data/mrjunejune/ # Swap -sudo rm -rf /opt/mrjunejune_server_bundle_active -sudo mv /opt/mrjunejune_server_bundle_new /opt/mrjunejune_server_bundle_active +sudo rm -rf "$active" +sudo mv "$staging" "$active" sudo systemctl restart mrjunejune_server.service echo "Deployment complete!"