This is an automated email from the ASF dual-hosted git repository.

zqr10159 pushed a commit to branch 2.0.0
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git

commit b84cb3a73a9f417c04ac020ff2ef5672e35a2d98
Author: Logic <[email protected]>
AuthorDate: Wed Aug 26 12:20:38 2026 +0800

    build: add immutable aws preview sync
---
 script/dev-preview/create-snapshot.sh       |  94 +++++++++++++++++++++++
 script/dev-preview/remote-after-sync.sh     |  20 +++++
 script/dev-preview/remote-backend-reload.sh | 112 ++++++++++++++++++++++++++++
 script/dev-preview/remote-sync.sh           |  63 ++++++++++++++++
 4 files changed, 289 insertions(+)

diff --git a/script/dev-preview/create-snapshot.sh 
b/script/dev-preview/create-snapshot.sh
new file mode 100755
index 0000000000..3c75f6e272
--- /dev/null
+++ b/script/dev-preview/create-snapshot.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+preview_region=${AWS_REGION:-us-east-1}
+preview_profile=${AWS_PROFILE:-hertzbeat-agent}
+preview_repository=${PREVIEW_REPOSITORY:-hertzbeat-preview}
+preview_branch=${PREVIEW_BRANCH:-preview/zhaoqingran/main}
+preview_remote="https://git-codecommit.${preview_region}.amazonaws.com/v1/repos/${preview_repository}";
+preview_root=$(git rev-parse --show-toplevel)
+preview_temp_dir=$(mktemp -d "${TMPDIR:-/tmp}/hertzbeat-preview.XXXXXX")
+preview_index="${preview_temp_dir}/index"
+
+cleanup_preview_temp_dir() {
+  if [[ -n ${preview_temp_dir:-} && -d ${preview_temp_dir} && 
${preview_temp_dir} == *hertzbeat-preview.* ]]; then
+    rm -rf -- "${preview_temp_dir}"
+  fi
+}
+trap cleanup_preview_temp_dir EXIT
+
+cd "${preview_root}"
+
+preview_status_before=$(git status --porcelain=v1 -z | git hash-object --stdin)
+GIT_INDEX_FILE="${preview_index}" git read-tree HEAD
+GIT_INDEX_FILE="${preview_index}" git add -u
+
+while IFS= read -r -d '' preview_untracked_path; do
+  GIT_INDEX_FILE="${preview_index}" git add -- "${preview_untracked_path}"
+done < <(
+  git ls-files --others --exclude-standard -z -- \
+    web-app/src \
+    script/dev-preview \
+    ':(glob)hertzbeat-*/**/src/**'
+)
+
+preview_sequence=$(date -u +%Y%m%dT%H%M%SZ)
+preview_metadata=$(printf 'preview-sequence=%s\ncanonical-head=%s\n' 
"${preview_sequence}" "$(git rev-parse HEAD)")
+preview_metadata_blob=$(printf '%s' "${preview_metadata}" | git hash-object -w 
--stdin)
+GIT_INDEX_FILE="${preview_index}" git update-index \
+  --add \
+  --cacheinfo "100644,${preview_metadata_blob},.hertzbeat-preview-revision"
+preview_tree=$(GIT_INDEX_FILE="${preview_index}" git write-tree)
+
+preview_aws_args=(--region "${preview_region}")
+preview_git_args=(-c credential.helper=)
+if [[ -n ${preview_profile} ]]; then
+  preview_aws_args+=(--profile "${preview_profile}")
+  preview_git_args+=(
+    -c "credential.helper=!aws --profile ${preview_profile} codecommit 
credential-helper \$@"
+  )
+else
+  preview_git_args+=(-c 'credential.helper=!aws codecommit credential-helper 
$@')
+fi
+preview_git_args+=(-c credential.UseHttpPath=true)
+
+preview_parent=$(
+  aws codecommit get-branch \
+    "${preview_aws_args[@]}" \
+    --repository-name "${preview_repository}" \
+    --branch-name "${preview_branch}" \
+    --query branch.commitId \
+    --output text 2>/dev/null || true
+)
+
+preview_commit_args=("${preview_tree}")
+if [[ ${preview_parent} =~ ^[0-9a-f]{40}$ ]]; then
+  git "${preview_git_args[@]}" fetch --quiet --no-tags "${preview_remote}" 
"refs/heads/${preview_branch}"
+  preview_parent=$(git rev-parse FETCH_HEAD)
+  preview_commit_args+=(-p "${preview_parent}")
+fi
+
+preview_commit=$(
+  printf 'HertzBeat preview %s\n' "${preview_sequence}" |
+    GIT_AUTHOR_NAME='HertzBeat Preview' \
+      GIT_AUTHOR_EMAIL='preview@localhost' \
+      GIT_COMMITTER_NAME='HertzBeat Preview' \
+      GIT_COMMITTER_EMAIL='preview@localhost' \
+      git commit-tree "${preview_commit_args[@]}"
+)
+
+git "${preview_git_args[@]}" push --quiet "${preview_remote}" \
+  "+${preview_commit}:refs/heads/${preview_branch}"
+
+preview_status_after=$(git status --porcelain=v1 -z | git hash-object --stdin)
+if [[ ${preview_status_before} != "${preview_status_after}" ]]; then
+  echo 'Preview snapshot unexpectedly changed the local worktree or index.' >&2
+  exit 1
+fi
+
+printf '{"branch":"%s","commit":"%s","tree":"%s","sequence":"%s"}\n' \
+  "${preview_branch}" \
+  "${preview_commit}" \
+  "${preview_tree}" \
+  "${preview_sequence}"
diff --git a/script/dev-preview/remote-after-sync.sh 
b/script/dev-preview/remote-after-sync.sh
new file mode 100755
index 0000000000..51783d46fd
--- /dev/null
+++ b/script/dev-preview/remote-after-sync.sh
@@ -0,0 +1,20 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+preview_previous=${1:-}
+preview_desired=${2:?desired preview commit is required}
+preview_source_dir=${PREVIEW_SOURCE_DIR:-/opt/hertzbeat-preview/source}
+
+if [[ ${preview_previous} =~ ^[0-9a-f]{40}$ ]] &&
+  git -C "${preview_source_dir}" cat-file -e "${preview_previous}^{commit}" 
2>/dev/null; then
+  if git -C "${preview_source_dir}" diff --quiet "${preview_previous}" 
"${preview_desired}" -- \
+    web-app/package.json web-app/pnpm-lock.yaml web-app/pnpm-workspace.yaml; 
then
+    :
+  else
+    pnpm --dir "${preview_source_dir}/web-app" install --frozen-lockfile
+  fi
+fi
+
+"${preview_source_dir}/script/dev-preview/remote-backend-reload.sh" \
+  "${preview_previous}" "${preview_desired}"
diff --git a/script/dev-preview/remote-backend-reload.sh 
b/script/dev-preview/remote-backend-reload.sh
new file mode 100755
index 0000000000..6cd9978431
--- /dev/null
+++ b/script/dev-preview/remote-backend-reload.sh
@@ -0,0 +1,112 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+preview_previous=${1:-}
+preview_desired=${2:?desired preview commit is required}
+preview_source_dir=${PREVIEW_SOURCE_DIR:-/opt/hertzbeat-preview/source}
+preview_state_dir=${PREVIEW_STATE_DIR:-/opt/hertzbeat-preview/state}
+preview_backend_service=${PREVIEW_BACKEND_SERVICE:-hertzbeat-preview-backend.service}
+preview_dry_run=${PREVIEW_BACKEND_DRY_RUN:-false}
+
+install -d -m 0755 "${preview_state_dir}"
+
+preview_full_reactor=false
+preview_backend_changed=false
+declare -A preview_module_set=()
+
+if [[ ! ${preview_previous} =~ ^[0-9a-f]{40}$ ]] ||
+  ! git -C "${preview_source_dir}" cat-file -e "${preview_previous}^{commit}" 
2>/dev/null; then
+  preview_full_reactor=true
+  preview_backend_changed=true
+else
+  while IFS= read -r preview_path; do
+    case "${preview_path}" in
+      pom.xml|mvnw|mvnw.cmd|.mvn/*)
+        preview_full_reactor=true
+        preview_backend_changed=true
+        ;;
+      */pom.xml)
+        preview_full_reactor=true
+        preview_backend_changed=true
+        ;;
+      hertzbeat-*/src/*|hertzbeat-*-*/src/*)
+        preview_backend_changed=true
+        preview_candidate=$(dirname "${preview_path}")
+        while [[ ${preview_candidate} != . && ${preview_candidate} != / ]]; do
+          if [[ -f ${preview_source_dir}/${preview_candidate}/pom.xml ]]; then
+            preview_module_set["${preview_candidate}"]=1
+            break
+          fi
+          preview_candidate=$(dirname "${preview_candidate}")
+        done
+        ;;
+    esac
+  done < <(git -C "${preview_source_dir}" diff --name-only 
"${preview_previous}" "${preview_desired}")
+fi
+
+if [[ ${preview_backend_changed} != true ]]; then
+  if [[ ${preview_dry_run} == true ]]; then
+    printf 'backend=none\n'
+  fi
+  exit 0
+fi
+
+if [[ ${preview_dry_run} == true ]]; then
+  if [[ ${preview_full_reactor} == true ]]; then
+    printf 'backend=full\n'
+  else
+    printf 'backend=modules:'
+    printf '%s\n' "${!preview_module_set[@]}" | LC_ALL=C sort | paste -sd, -
+  fi
+  exit 0
+fi
+
+printf '%s\n' "${preview_desired}" >"${preview_state_dir}/backend-applying"
+
+preview_maven_args=(
+  -T 1C
+  -DskipTests
+  -DskipITs
+  -Dsurefire.failIfNoSpecifiedTests=false
+  -DfailIfNoTests=false
+)
+
+if [[ ${preview_full_reactor} == true ]]; then
+  preview_maven_args+=(-pl hertzbeat-startup -am install)
+else
+  preview_modules=$(
+    printf '%s\n' "${!preview_module_set[@]}" |
+      LC_ALL=C sort |
+      paste -sd, -
+  )
+  if [[ -z ${preview_modules} ]]; then
+    echo 'Backend changes were detected without a resolvable Maven module.' >&2
+    exit 1
+  fi
+  preview_maven_args+=(-pl "${preview_modules}" -am install)
+fi
+
+preview_started_at=$(date +%s)
+(
+  cd "${preview_source_dir}"
+  ./mvnw "${preview_maven_args[@]}"
+)
+
+systemctl restart "${preview_backend_service}"
+for _ in $(seq 1 120); do
+  if curl --fail --silent --show-error \
+    http://127.0.0.1:1157/api/setup/status >/dev/null 2>&1; then
+    preview_finished_at=$(date +%s)
+    printf '%s\n' "${preview_desired}" >"${preview_state_dir}/backend-active"
+    printf '%s\n' "$((preview_finished_at - preview_started_at))" \
+      >"${preview_state_dir}/backend-last-seconds"
+    rm -f "${preview_state_dir}/backend-applying" 
"${preview_state_dir}/backend-failed"
+    exit 0
+  fi
+  sleep 2
+done
+
+printf '%s\n' "${preview_desired}" >"${preview_state_dir}/backend-failed"
+echo 'Backend did not become ready after the controlled restart.' >&2
+exit 1
diff --git a/script/dev-preview/remote-sync.sh 
b/script/dev-preview/remote-sync.sh
new file mode 100755
index 0000000000..27393d9bb7
--- /dev/null
+++ b/script/dev-preview/remote-sync.sh
@@ -0,0 +1,63 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+preview_region=${AWS_REGION:-us-east-1}
+preview_repository=${PREVIEW_REPOSITORY:-hertzbeat-preview}
+preview_branch=${PREVIEW_BRANCH:-preview/zhaoqingran/main}
+preview_source_dir=${PREVIEW_SOURCE_DIR:-/opt/hertzbeat-preview/source}
+preview_state_dir=${PREVIEW_STATE_DIR:-/opt/hertzbeat-preview/state}
+preview_remote="https://git-codecommit.${preview_region}.amazonaws.com/v1/repos/${preview_repository}";
+preview_git_args=(
+  -c credential.helper=
+  -c "credential.helper=!aws --region ${preview_region} codecommit 
credential-helper \$@"
+  -c credential.UseHttpPath=true
+)
+
+install -d -m 0755 "${preview_state_dir}"
+exec 9>"${preview_state_dir}/sync.lock"
+flock -n 9 || exit 0
+
+preview_desired=$(
+  aws codecommit get-branch \
+    --region "${preview_region}" \
+    --repository-name "${preview_repository}" \
+    --branch-name "${preview_branch}" \
+    --query branch.commitId \
+    --output text
+)
+if [[ ! ${preview_desired} =~ ^[0-9a-f]{40}$ ]]; then
+  echo "Invalid desired preview commit: ${preview_desired}" >&2
+  exit 1
+fi
+
+preview_active=''
+if [[ -f ${preview_state_dir}/active ]]; then
+  preview_active=$(<"${preview_state_dir}/active")
+fi
+if [[ ${preview_active} == "${preview_desired}" ]]; then
+  exit 0
+fi
+
+printf '%s\n' "${preview_desired}" >"${preview_state_dir}/desired"
+printf '%s\n' "${preview_desired}" >"${preview_state_dir}/applying"
+
+git -C "${preview_source_dir}" "${preview_git_args[@]}" fetch --quiet 
--no-tags "${preview_remote}" \
+  "refs/heads/${preview_branch}"
+preview_fetched=$(git -C "${preview_source_dir}" rev-parse FETCH_HEAD)
+if [[ ${preview_fetched} != "${preview_desired}" ]]; then
+  echo "Preview head advanced during fetch; reconciliation will retry." >&2
+  exit 75
+fi
+
+git -C "${preview_source_dir}" reset --hard "${preview_desired}" >/dev/null
+
+if [[ -x ${preview_state_dir}/after-sync ]]; then
+  "${preview_state_dir}/after-sync" "${preview_active}" "${preview_desired}"
+fi
+
+printf '%s\n' "${preview_desired}" >"${preview_state_dir}/active"
+date -u +%Y-%m-%dT%H:%M:%SZ >"${preview_state_dir}/updated-at"
+rm -f "${preview_state_dir}/applying"
+
+printf 'active=%s\n' "${preview_desired}"


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to