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"