#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" TMP_ROOT="$(mktemp -d)" trap 'rm -rf "${TMP_ROOT}"' EXIT WORK_DIR="${TMP_ROOT}/workspace" FAKE_BIN_DIR="${TMP_ROOT}/fake-bin" TARGET_BIN_DIR="${TMP_ROOT}/target-bin" SPACETIME_ROOT_DIR="${TMP_ROOT}/stdb" OUTPUT_LOG="${TMP_ROOT}/prepare.log" mkdir -p \ "${WORK_DIR}" \ "${FAKE_BIN_DIR}" \ "${TARGET_BIN_DIR}" \ "${SPACETIME_ROOT_DIR}/bin/current" cat >"${FAKE_BIN_DIR}/curl" <<'EOF' #!/usr/bin/env bash echo "curl should not be called when target tools are already ready" >&2 exit 97 EOF cat >"${FAKE_BIN_DIR}/wget" <<'EOF' #!/usr/bin/env bash echo "wget should not be called when target tools are already ready" >&2 exit 97 EOF chmod +x "${FAKE_BIN_DIR}/curl" "${FAKE_BIN_DIR}/wget" cat >"${TARGET_BIN_DIR}/otelcol-contrib" <<'EOF' #!/usr/bin/env bash echo "otelcol-contrib version 0.151.0" EOF chmod +x "${TARGET_BIN_DIR}/otelcol-contrib" cat >"${SPACETIME_ROOT_DIR}/bin/current/spacetimedb-cli" <<'EOF' #!/usr/bin/env bash cat <<'VERSION' spacetime Path: /tmp/spacetimedb-cli Commit: 8e410d2842147bd8e5a32a9589cc00c19f7478e2 spacetimedb tool version 2.8.3; spacetimedb-lib version 2.8.3; VERSION EOF cat >"${SPACETIME_ROOT_DIR}/bin/current/spacetimedb-standalone" <<'EOF' #!/usr/bin/env bash echo "spacetimedb-standalone 2.8.3" EOF chmod +x \ "${SPACETIME_ROOT_DIR}/bin/current/spacetimedb-cli" \ "${SPACETIME_ROOT_DIR}/bin/current/spacetimedb-standalone" if ! ( cd "${WORK_DIR}" PATH="${FAKE_BIN_DIR}:${PATH}" \ WORKSPACE="${WORK_DIR}" \ PROVISION_TOOLS_DIR="provision-tools" \ PROVISION_DOWNLOADS_DIR="downloads" \ PROVISION_TOOLS_TMP_PARENT="${WORK_DIR}/.tmp/server-provision-tools" \ PROVISION_REQUIRE_LOCAL_DOWNLOADS="true" \ OTELCOL_TARGET_BIN="${TARGET_BIN_DIR}/otelcol-contrib" \ OTELCOL_VERSION="0.151.0" \ SPACETIME_ROOT="${SPACETIME_ROOT_DIR}" \ "${REPO_ROOT}/scripts/prepare-server-provision-tools.sh" \ >"${OUTPUT_LOG}" 2>&1 ); then echo "[check-server-provision-tools] prepare-server-provision-tools.sh 执行失败。" >&2 cat "${OUTPUT_LOG}" >&2 exit 1 fi grep -q "复用目标机已有 otelcol-contrib" "${OUTPUT_LOG}" grep -q "复用目标机已有 SpacetimeDB 安装" "${OUTPUT_LOG}" grep -q "otelcol-contrib 0.151.0 target existing" "${WORK_DIR}/provision-tools/MANIFEST.txt" grep -q "spacetime target existing" "${WORK_DIR}/provision-tools/MANIFEST.txt" test -x "${WORK_DIR}/provision-tools/otelcol-contrib" test -x "${WORK_DIR}/provision-tools/spacetime/spacetime" test -x "${WORK_DIR}/provision-tools/spacetime/bin/current/spacetimedb-cli" test -x "${WORK_DIR}/provision-tools/spacetime/bin/current/spacetimedb-standalone" if grep -q "下载 " "${OUTPUT_LOG}"; then echo "[check-server-provision-tools] 已有目标机工具时不应进入下载分支。" >&2 cat "${OUTPUT_LOG}" >&2 exit 1 fi BARE_TAG_ROOT_DIR="${TMP_ROOT}/bare-tag-stdb" BARE_TAG_WORK_DIR="${TMP_ROOT}/bare-tag-workspace" BARE_TAG_LOG="${TMP_ROOT}/bare-tag.log" mkdir -p "${BARE_TAG_ROOT_DIR}/bin/current" "${BARE_TAG_WORK_DIR}" cat >"${BARE_TAG_ROOT_DIR}/bin/current/spacetimedb-cli" <<'EOF' #!/usr/bin/env bash cat <<'VERSION' spacetime Path: /tmp/spacetimedb-cli Commit: 0000000000000000000000000000000000000000 spacetimedb tool version 2.8.3; spacetimedb-lib version 2.8.3; VERSION EOF cat >"${BARE_TAG_ROOT_DIR}/bin/current/spacetimedb-standalone" <<'EOF' #!/usr/bin/env bash echo "spacetimedb-standalone 2.8.3" EOF chmod +x \ "${BARE_TAG_ROOT_DIR}/bin/current/spacetimedb-cli" \ "${BARE_TAG_ROOT_DIR}/bin/current/spacetimedb-standalone" if ( cd "${BARE_TAG_WORK_DIR}" PATH="${FAKE_BIN_DIR}:${PATH}" \ WORKSPACE="${BARE_TAG_WORK_DIR}" \ PROVISION_TOOLS_DIR="provision-tools" \ PROVISION_DOWNLOADS_DIR="downloads" \ PROVISION_TOOLS_TMP_PARENT="${BARE_TAG_WORK_DIR}/.tmp/server-provision-tools" \ PROVISION_REQUIRE_LOCAL_DOWNLOADS="true" \ PREPARE_OTELCOL="false" \ SPACETIME_ROOT="${BARE_TAG_ROOT_DIR}" \ "${REPO_ROOT}/scripts/prepare-server-provision-tools.sh" \ >"${BARE_TAG_LOG}" 2>&1 ); then echo "[check-server-provision-tools] commit 不匹配的 v2.8.3 不应通过复用门禁。" >&2 cat "${BARE_TAG_LOG}" >&2 exit 1 fi grep -q "SpacetimeDB commit 不匹配" "${BARE_TAG_LOG}" if grep -q "复用目标机已有 SpacetimeDB 安装" "${BARE_TAG_LOG}"; then echo "[check-server-provision-tools] commit 不匹配的 v2.8.3 被错误复用。" >&2 cat "${BARE_TAG_LOG}" >&2 exit 1 fi BARE_ARCHIVE_DIR="${TMP_ROOT}/bare-archive" BARE_ARCHIVE_PATH="${TMP_ROOT}/bare-spacetime.tar.gz" BARE_ARCHIVE_WORK_DIR="${TMP_ROOT}/bare-archive-workspace" BARE_ARCHIVE_LOG="${TMP_ROOT}/bare-archive.log" mkdir -p "${BARE_ARCHIVE_DIR}" "${BARE_ARCHIVE_WORK_DIR}" cp \ "${BARE_TAG_ROOT_DIR}/bin/current/spacetimedb-cli" \ "${BARE_TAG_ROOT_DIR}/bin/current/spacetimedb-standalone" \ "${BARE_ARCHIVE_DIR}/" tar -czf "${BARE_ARCHIVE_PATH}" -C "${BARE_ARCHIVE_DIR}" \ spacetimedb-cli spacetimedb-standalone if ( cd "${BARE_ARCHIVE_WORK_DIR}" PATH="${FAKE_BIN_DIR}:${PATH}" \ WORKSPACE="${BARE_ARCHIVE_WORK_DIR}" \ PROVISION_TOOLS_DIR="provision-tools" \ PROVISION_DOWNLOADS_DIR="downloads" \ PROVISION_TOOLS_TMP_PARENT="${BARE_ARCHIVE_WORK_DIR}/.tmp/server-provision-tools" \ PROVISION_REQUIRE_LOCAL_DOWNLOADS="true" \ PREPARE_OTELCOL="false" \ SPACETIME_ROOT="${TMP_ROOT}/missing-target-stdb" \ SPACETIME_ARCHIVE_PATH="${BARE_ARCHIVE_PATH}" \ "${REPO_ROOT}/scripts/prepare-server-provision-tools.sh" \ >"${BARE_ARCHIVE_LOG}" 2>&1 ); then echo "[check-server-provision-tools] commit 不匹配的 v2.8.3 archive 不应通过安装结果门禁。" >&2 cat "${BARE_ARCHIVE_LOG}" >&2 exit 1 fi grep -q "安装结果 commit 不匹配" "${BARE_ARCHIVE_LOG}" echo "[check-server-provision-tools] OK"