Mercurial
annotate hg-web/deploy.sh @ 234:1de6f553cbc0
[resume] Add Microsoft Member of Technical Staff role
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Sun, 02 Aug 2026 18:27:15 -0700 |
| parents | 8bb0ac8f4587 |
| children | c5129452493e |
| rev | line source |
|---|---|
|
221
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
1 #!/usr/bin/env bash |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
2 set -Eeuo pipefail |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
3 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
4 SERVICE_NAME="${SERVICE_NAME:-hg_web_server.service}" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
5 RELEASE_ROOT="${RELEASE_ROOT:-/opt/hg_web_server_releases}" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
6 ACTIVE_PATH="${ACTIVE_PATH:-/opt/hg_web_server_bundle_active}" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
7 HEALTH_URL="${HEALTH_URL:-http://127.0.0.1:6970/}" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
8 SERVICE_USER="${SERVICE_USER:-hg_web_server}" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
9 SERVICE_GROUP="${SERVICE_GROUP:-zenbu_team}" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
10 |
|
227
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
11 workspace="${BUILD_WORKSPACE_DIRECTORY:-$(hg root)}" |
|
221
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
12 cd "$workspace" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
13 |
|
227
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
14 if [[ -n "${BUILD_WORKSPACE_DIRECTORY:-}" ]]; then |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
15 if [[ -n "${RUNFILES_DIR:-}" ]]; then |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
16 source "$RUNFILES_DIR/bazel_tools/tools/bash/runfiles/runfiles.bash" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
17 elif [[ -n "${RUNFILES_MANIFEST_FILE:-}" ]]; then |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
18 runfiles_library="$( |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
19 grep -sm1 '^bazel_tools/tools/bash/runfiles/runfiles.bash ' \ |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
20 "$RUNFILES_MANIFEST_FILE" | cut -d' ' -f2- |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
21 )" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
22 source "$runfiles_library" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
23 elif [[ -d "$0.runfiles" ]]; then |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
24 RUNFILES_DIR="$0.runfiles" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
25 export RUNFILES_DIR |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
26 source "$RUNFILES_DIR/bazel_tools/tools/bash/runfiles/runfiles.bash" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
27 elif [[ -f "$0.runfiles_manifest" ]]; then |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
28 RUNFILES_MANIFEST_FILE="$0.runfiles_manifest" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
29 export RUNFILES_MANIFEST_FILE |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
30 runfiles_library="$( |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
31 grep -sm1 '^bazel_tools/tools/bash/runfiles/runfiles.bash ' \ |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
32 "$RUNFILES_MANIFEST_FILE" | cut -d' ' -f2- |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
33 )" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
34 source "$runfiles_library" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
35 else |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
36 echo "Bazel runfiles are unavailable." >&2 |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
37 exit 1 |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
38 fi |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
39 bundle_dir="$(rlocation _main/hg-web/hg_web_server_bundle)" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
40 else |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
41 bazel build -c opt //hg-web:hg_web_server_bundle |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
42 bundle_dir="bazel-bin/hg-web/hg_web_server_bundle" |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
43 fi |
|
8bb0ac8f4587
[hg-web] Add Bazel deployment target
MrJuneJune <me@mrjunejune.com>
parents:
221
diff
changeset
|
44 |
|
221
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
45 revision="$(hg log -r . -T '{node|short}')" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
46 release_name="${revision}-$(date -u +%Y%m%dT%H%M%SZ)" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
47 release_dir="${RELEASE_ROOT}/${release_name}" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
48 staging_dir="${RELEASE_ROOT}/.${release_name}.tmp" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
49 next_link="${ACTIVE_PATH}.next" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
50 previous_release="" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
51 promoted=0 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
52 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
53 health_check() { |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
54 for _ in $(seq 1 20); do |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
55 if curl --fail --silent --max-time 3 "$HEALTH_URL" >/dev/null; then |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
56 return 0 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
57 fi |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
58 sleep 1 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
59 done |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
60 echo "Health check failed: $HEALTH_URL" >&2 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
61 return 1 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
62 } |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
63 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
64 point_active_at() { |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
65 local target="$1" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
66 sudo rm -f "$next_link" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
67 sudo ln -s "$target" "$next_link" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
68 sudo mv -Tf "$next_link" "$ACTIVE_PATH" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
69 } |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
70 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
71 rollback() { |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
72 trap - ERR |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
73 if [[ "$promoted" -eq 1 && -n "$previous_release" && -d "$previous_release" ]]; then |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
74 echo "Deployment failed; rolling back to $previous_release" >&2 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
75 point_active_at "$previous_release" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
76 sudo systemctl restart "$SERVICE_NAME" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
77 health_check || echo "Rollback completed, but the health check still fails." >&2 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
78 else |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
79 echo "Deployment failed and no previous release is available for rollback." >&2 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
80 fi |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
81 sudo rm -rf "$staging_dir" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
82 exit 1 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
83 } |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
84 trap rollback ERR |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
85 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
86 sudo install -d -o root -g "$SERVICE_GROUP" -m 0755 "$RELEASE_ROOT" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
87 sudo rm -rf "$staging_dir" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
88 sudo install -d -o "$SERVICE_USER" -g "$SERVICE_GROUP" -m 0755 "$staging_dir" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
89 sudo cp -a "${bundle_dir}/." "$staging_dir/" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
90 sudo chown -R "$SERVICE_USER:$SERVICE_GROUP" "$staging_dir" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
91 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
92 sudo test -x "$staging_dir/hg_web_server" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
93 sudo test -f "$staging_dir/hg-web/src/index.html" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
94 sudo test -f "$staging_dir/hg-web/src/page.js" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
95 sudo mv "$staging_dir" "$release_dir" |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
96 |
|
221
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
97 if [[ -L "$ACTIVE_PATH" ]]; then |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
98 previous_release="$(readlink -f "$ACTIVE_PATH")" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
99 elif [[ -d "$ACTIVE_PATH" ]]; then |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
100 previous_release="${RELEASE_ROOT}/legacy-$(date -u +%Y%m%dT%H%M%SZ)" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
101 sudo mv "$ACTIVE_PATH" "$previous_release" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
102 fi |
|
104
2301aeb7503b
[Hg Web] Super simple mercurial server.
June Park <parkjune1995@gmail.com>
parents:
diff
changeset
|
103 |
|
221
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
104 point_active_at "$release_dir" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
105 promoted=1 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
106 sudo systemctl restart "$SERVICE_NAME" |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
107 health_check |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
108 |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
109 trap - ERR |
|
ce7f4400c2de
[hg-web] Harden forge and add changeset UI
MrJuneJune <me@mrjunejune.com>
parents:
105
diff
changeset
|
110 echo "Deployment complete: $release_dir" |