Mercurial
comparison hg-web/deploy.sh @ 226:3fa4bf481f42
[merge] Merge hg-web into default
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sun, 02 Aug 2026 14:42:01 -0700 |
| parents | ce7f4400c2de |
| children | 8bb0ac8f4587 |
comparison
equal
deleted
inserted
replaced
| 220:eb8b4230fdb9 | 226:3fa4bf481f42 |
|---|---|
| 1 #!/bin/bash | 1 #!/usr/bin/env bash |
| 2 # sudo groupadd zenbu_team -- already added | 2 set -Eeuo pipefail |
| 3 # sudo useradd -r -s /usr/sbin/nologin -G zenbu_team hg_web_server | 3 |
| 4 SERVICE_NAME="${SERVICE_NAME:-hg_web_server.service}" | |
| 5 RELEASE_ROOT="${RELEASE_ROOT:-/opt/hg_web_server_releases}" | |
| 6 ACTIVE_PATH="${ACTIVE_PATH:-/opt/hg_web_server_bundle_active}" | |
| 7 HEALTH_URL="${HEALTH_URL:-http://127.0.0.1:6970/}" | |
| 8 SERVICE_USER="${SERVICE_USER:-hg_web_server}" | |
| 9 SERVICE_GROUP="${SERVICE_GROUP:-zenbu_team}" | |
| 10 | |
| 11 workspace="$(hg root)" | |
| 12 cd "$workspace" | |
| 13 | |
| 14 revision="$(hg log -r . -T '{node|short}')" | |
| 15 release_name="${revision}-$(date -u +%Y%m%dT%H%M%SZ)" | |
| 16 release_dir="${RELEASE_ROOT}/${release_name}" | |
| 17 staging_dir="${RELEASE_ROOT}/.${release_name}.tmp" | |
| 18 next_link="${ACTIVE_PATH}.next" | |
| 19 bundle_dir="bazel-bin/hg-web/hg_web_server_bundle" | |
| 20 previous_release="" | |
| 21 promoted=0 | |
| 22 | |
| 23 health_check() { | |
| 24 for _ in $(seq 1 20); do | |
| 25 if curl --fail --silent --max-time 3 "$HEALTH_URL" >/dev/null; then | |
| 26 return 0 | |
| 27 fi | |
| 28 sleep 1 | |
| 29 done | |
| 30 echo "Health check failed: $HEALTH_URL" >&2 | |
| 31 return 1 | |
| 32 } | |
| 33 | |
| 34 point_active_at() { | |
| 35 local target="$1" | |
| 36 sudo rm -f "$next_link" | |
| 37 sudo ln -s "$target" "$next_link" | |
| 38 sudo mv -Tf "$next_link" "$ACTIVE_PATH" | |
| 39 } | |
| 40 | |
| 41 rollback() { | |
| 42 trap - ERR | |
| 43 if [[ "$promoted" -eq 1 && -n "$previous_release" && -d "$previous_release" ]]; then | |
| 44 echo "Deployment failed; rolling back to $previous_release" >&2 | |
| 45 point_active_at "$previous_release" | |
| 46 sudo systemctl restart "$SERVICE_NAME" | |
| 47 health_check || echo "Rollback completed, but the health check still fails." >&2 | |
| 48 else | |
| 49 echo "Deployment failed and no previous release is available for rollback." >&2 | |
| 50 fi | |
| 51 sudo rm -rf "$staging_dir" | |
| 52 exit 1 | |
| 53 } | |
| 54 trap rollback ERR | |
| 55 | |
| 4 bazel build -c opt //hg-web:hg_web_server_bundle | 56 bazel build -c opt //hg-web:hg_web_server_bundle |
| 5 | 57 |
| 6 # Create | 58 sudo install -d -o root -g "$SERVICE_GROUP" -m 0755 "$RELEASE_ROOT" |
| 7 sudo cp -a bazel-bin/hg-web/hg_web_server_bundle /opt/hg_web_server_bundle_new | 59 sudo rm -rf "$staging_dir" |
| 8 sudo chown -R hg_web_server:zenbu_team /opt/hg_web_server_bundle_new | 60 sudo install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0755 "$staging_dir" |
| 61 sudo cp -a "${bundle_dir}/." "$staging_dir/" | |
| 62 sudo chown -R "$SERVICE_USER:$SERVICE_GROUP" "$staging_dir" | |
| 9 | 63 |
| 10 # Swap | 64 sudo test -x "$staging_dir/hg_web_server" |
| 11 sudo rm -rf /opt/hg_web_server_bundle_active | 65 sudo test -f "$staging_dir/hg-web/src/index.html" |
| 12 sudo mv /opt/hg_web_server_bundle_new /opt/hg_web_server_bundle_active | 66 sudo test -f "$staging_dir/hg-web/src/page.js" |
| 67 sudo mv "$staging_dir" "$release_dir" | |
| 13 | 68 |
| 14 sudo systemctl restart hg_web_server.service | 69 if [[ -L "$ACTIVE_PATH" ]]; then |
| 15 echo "Deployment complete!" | 70 previous_release="$(readlink -f "$ACTIVE_PATH")" |
| 71 elif [[ -d "$ACTIVE_PATH" ]]; then | |
| 72 previous_release="${RELEASE_ROOT}/legacy-$(date -u +%Y%m%dT%H%M%SZ)" | |
| 73 sudo mv "$ACTIVE_PATH" "$previous_release" | |
| 74 fi | |
| 75 | |
| 76 point_active_at "$release_dir" | |
| 77 promoted=1 | |
| 78 sudo systemctl restart "$SERVICE_NAME" | |
| 79 health_check | |
| 80 | |
| 81 trap - ERR | |
| 82 echo "Deployment complete: $release_dir" |