133 lines
4.1 KiB
Bash
133 lines
4.1 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
PROVISION_TOOLS_DIR="${PROVISION_TOOLS_DIR:-provision-tools}"
|
|
OTELCOL_VERSION="${OTELCOL_VERSION:-0.151.0}"
|
|
OTELCOL_DOWNLOAD_ROOT="${OTELCOL_DOWNLOAD_ROOT:-https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download}"
|
|
SPACETIME_INSTALLER_URL="${SPACETIME_INSTALLER_URL:-https://install.spacetimedb.com}"
|
|
SPACETIME_DOWNLOAD_ROOT="${SPACETIME_DOWNLOAD_ROOT:-https://github.com/clockworklabs/SpacetimeDB/releases/latest/download}"
|
|
PROVISION_TOOLS_TMP_PARENT="${PROVISION_TOOLS_TMP_PARENT:-${WORKSPACE:-$(pwd)}/.tmp/server-provision-tools}"
|
|
TMP_DIR_TO_CLEAN=""
|
|
|
|
cleanup_tmp_dir() {
|
|
if [[ -n "${TMP_DIR_TO_CLEAN}" ]]; then
|
|
rm -rf "${TMP_DIR_TO_CLEAN}"
|
|
fi
|
|
}
|
|
|
|
require_cmd() {
|
|
local name="$1"
|
|
if ! command -v "${name}" >/dev/null 2>&1; then
|
|
echo "[prepare-provision-tools] 缺少命令: ${name}" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
download_file() {
|
|
local url="$1"
|
|
local output="$2"
|
|
|
|
if command -v curl >/dev/null 2>&1; then
|
|
curl -fsSL --retry 3 --retry-delay 2 "${url}" -o "${output}"
|
|
elif command -v wget >/dev/null 2>&1; then
|
|
wget -O "${output}" "${url}"
|
|
else
|
|
echo "[prepare-provision-tools] 需要 curl 或 wget 下载: ${url}" >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
make_spacetime_wrapper() {
|
|
local target="$1"
|
|
|
|
cat >"${target}" <<'EOF'
|
|
#!/usr/bin/env sh
|
|
set -eu
|
|
SELF_DIR=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
|
exec "$SELF_DIR/bin/current/spacetimedb-cli" "$@"
|
|
EOF
|
|
chmod 0755 "${target}"
|
|
}
|
|
|
|
prepare_otelcol() {
|
|
local tmp_dir="$1"
|
|
local archive="${tmp_dir}/otelcol-contrib.tar.gz"
|
|
local extract_dir="${tmp_dir}/otelcol-contrib"
|
|
local url="${OTELCOL_DOWNLOAD_ROOT}/v${OTELCOL_VERSION}/otelcol-contrib_${OTELCOL_VERSION}_linux_amd64.tar.gz"
|
|
local target="${PROVISION_TOOLS_DIR}/otelcol-contrib"
|
|
|
|
require_cmd tar
|
|
|
|
echo "[prepare-provision-tools] 下载 otelcol-contrib: ${url}"
|
|
mkdir -p "${extract_dir}"
|
|
download_file "${url}" "${archive}"
|
|
tar -xzf "${archive}" -C "${extract_dir}"
|
|
|
|
if [[ ! -x "${extract_dir}/otelcol-contrib" ]]; then
|
|
echo "[prepare-provision-tools] otelcol-contrib 包中缺少可执行文件。" >&2
|
|
exit 1
|
|
fi
|
|
|
|
install -m 0755 "${extract_dir}/otelcol-contrib" "${target}"
|
|
"${target}" --version >/dev/null
|
|
}
|
|
|
|
prepare_spacetime() {
|
|
local tmp_dir="$1"
|
|
local install_root="${tmp_dir}/spacetime-root"
|
|
local target_dir="${PROVISION_TOOLS_DIR}/spacetime"
|
|
|
|
echo "[prepare-provision-tools] 使用官方安装器准备 SpacetimeDB: ${SPACETIME_INSTALLER_URL}"
|
|
mkdir -p "${install_root}"
|
|
download_file "${SPACETIME_INSTALLER_URL}" "${tmp_dir}/spacetime-install.sh"
|
|
chmod 0755 "${tmp_dir}/spacetime-install.sh"
|
|
TMPDIR="${tmp_dir}" SPACETIME_DOWNLOAD_ROOT="${SPACETIME_DOWNLOAD_ROOT}" sh "${tmp_dir}/spacetime-install.sh" --root-dir "${install_root}" -y
|
|
|
|
if [[ ! -x "${install_root}/bin/current/spacetimedb-cli" ]]; then
|
|
echo "[prepare-provision-tools] SpacetimeDB 安装结果缺少 bin/current/spacetimedb-cli。" >&2
|
|
exit 1
|
|
fi
|
|
if [[ ! -x "${install_root}/bin/current/spacetimedb-standalone" ]]; then
|
|
echo "[prepare-provision-tools] SpacetimeDB 安装结果缺少 bin/current/spacetimedb-standalone。" >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p "${target_dir}"
|
|
cp -a "${install_root}/bin" "${target_dir}/bin"
|
|
make_spacetime_wrapper "${target_dir}/spacetime"
|
|
|
|
"${target_dir}/spacetime" --version >/dev/null
|
|
}
|
|
|
|
main() {
|
|
local tmp_dir
|
|
|
|
require_cmd chmod
|
|
require_cmd cp
|
|
require_cmd install
|
|
require_cmd mktemp
|
|
require_cmd rm
|
|
|
|
mkdir -p "${PROVISION_TOOLS_TMP_PARENT}"
|
|
tmp_dir="$(mktemp -d "${PROVISION_TOOLS_TMP_PARENT%/}/run.XXXXXX")"
|
|
TMP_DIR_TO_CLEAN="${tmp_dir}"
|
|
trap cleanup_tmp_dir EXIT
|
|
|
|
rm -rf "${PROVISION_TOOLS_DIR}"
|
|
mkdir -p "${PROVISION_TOOLS_DIR}"
|
|
|
|
prepare_otelcol "${tmp_dir}"
|
|
prepare_spacetime "${tmp_dir}"
|
|
|
|
cat >"${PROVISION_TOOLS_DIR}/MANIFEST.txt" <<EOF
|
|
otelcol-contrib ${OTELCOL_VERSION}
|
|
spacetime installer ${SPACETIME_INSTALLER_URL}
|
|
spacetime download root ${SPACETIME_DOWNLOAD_ROOT}
|
|
EOF
|
|
|
|
echo "[prepare-provision-tools] 工具包已准备: ${PROVISION_TOOLS_DIR}"
|
|
find "${PROVISION_TOOLS_DIR}" -maxdepth 5 \( -type f -o -type l \) | sort
|
|
}
|
|
|
|
main "$@"
|