#!/usr/bin/env bash set -euo pipefail # Make ARM server deployment package (master + prometheus + grafana + alertmanager + web) ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" TEMPL_DIR="$ROOT_DIR/deployment_new/templates/server_arm" ART_ROOT="$ROOT_DIR/deployment_new/artifact/server_arm" COMMON_SH="$ROOT_DIR/deployment_new/build/common.sh" . "$COMMON_SH" usage(){ cat </ and server_arm_YYYYMMDD.tar.gz EOF } VERSION="" while [[ $# -gt 0 ]]; do case "$1" in --version) VERSION="$2"; shift 2;; -h|--help) usage; exit 0;; *) err "unknown arg: $1"; usage; exit 1;; esac done if [[ -z "$VERSION" ]]; then VERSION="$(today_version)"; fi require_cmd docker tar gzip awk sed IMAGES=( argus-master-arm64 argus-metric-prometheus-arm64 argus-metric-prometheus-targets-updater-arm64 argus-metric-grafana-arm64 argus-alertmanager-arm64 argus-web-frontend-arm64 argus-web-proxy-arm64 ) STAGE="$(mktemp -d)"; trap 'rm -rf "$STAGE"' EXIT PKG_DIR="$ART_ROOT/$VERSION" mkdir -p "$PKG_DIR" "$STAGE/images" "$STAGE/compose" "$STAGE/docs" "$STAGE/scripts" "$STAGE/private/argus" # 1) Save per-image tars with version tag log "Tagging and saving ARM server images (version=$VERSION)" for repo in "${IMAGES[@]}"; do if ! docker image inspect "$repo:latest" >/dev/null 2>&1 && ! docker image inspect "$repo:$VERSION" >/dev/null 2>&1; then err "missing image: $repo (need :latest or :$VERSION)"; exit 1; fi if docker image inspect "$repo:$VERSION" >/dev/null 2>&1; then tag="$repo:$VERSION" else docker tag "$repo:latest" "$repo:$VERSION" tag="$repo:$VERSION" fi out_tar="$STAGE/images/${repo//\//-}-$VERSION.tar" docker save -o "$out_tar" "$tag" gzip -f "$out_tar" done # 1.1) (可选)打包 x86 ARM 测试用基础镜像 ubuntu:22.04(供 scripts_for_x86/install.sh 使用) TEST_BASE="ubuntu:22.04" if docker image inspect "$TEST_BASE" >/dev/null 2>&1 || docker pull "$TEST_BASE" >/dev/null 2>&1; then log "Saving ARM test base image for x86 host: $TEST_BASE" test_tar="$STAGE/images/ubuntu-22.04-arm-test.tar" docker save -o "$test_tar" "$TEST_BASE" gzip -f "$test_tar" else warn "无法获取 $TEST_BASE,x86 上的 ARM 运行能力将无法使用该镜像做快速自检(可忽略,或在目标机自行拉取)。" fi # 1.2) 随包提供 tonistiigi/binfmt 镜像,便于 x86 离线机器安装 binfmt/QEMU BINFMT_IMAGE="tonistiigi/binfmt:latest" if docker image inspect "$BINFMT_IMAGE" >/dev/null 2>&1 || docker pull "$BINFMT_IMAGE" >/dev/null 2>&1; then log "Saving binfmt helper image for x86 host: $BINFMT_IMAGE" binfmt_tar="$STAGE/images/tonistiigi-binfmt.tar" docker save -o "$binfmt_tar" "$BINFMT_IMAGE" gzip -f "$binfmt_tar" else warn "无法获取 $BINFMT_IMAGE,x86 上将无法通过离线方式安装 binfmt(可在目标机上自行 docker pull)。" fi # 2) Compose + env template(ARM 专用) cp "$TEMPL_DIR/compose/docker-compose.yml" "$STAGE/compose/docker-compose.yml" ENV_EX="$STAGE/compose/.env.example" cat >"$ENV_EX" </dev/null || true fi # x86 专用脚本:用于在 x86_64 主机上运行 ARM server 包 SCRIPTS_X86_SRC="$TEMPL_DIR/scripts_for_x86" if [[ -d "$SCRIPTS_X86_SRC" ]]; then copy_tree "$SCRIPTS_X86_SRC" "$STAGE/scripts_for_x86" find "$STAGE/scripts_for_x86" -type f -name '*.sh' -exec chmod +x {} + 2>/dev/null || true fi # 4) Private skeleton (最小 ARM server 所需目录) mkdir -p \ "$STAGE/private/argus/etc" \ "$STAGE/private/argus/master" \ "$STAGE/private/argus/metric/prometheus" \ "$STAGE/private/argus/metric/prometheus/data" \ "$STAGE/private/argus/metric/prometheus/rules" \ "$STAGE/private/argus/metric/prometheus/targets" \ "$STAGE/private/argus/metric/grafana" \ "$STAGE/private/argus/metric/grafana/data" \ "$STAGE/private/argus/metric/grafana/logs" \ "$STAGE/private/argus/metric/grafana/plugins" \ "$STAGE/private/argus/metric/grafana/provisioning/datasources" \ "$STAGE/private/argus/metric/grafana/provisioning/dashboards" \ "$STAGE/private/argus/metric/grafana/data/sessions" \ "$STAGE/private/argus/metric/grafana/data/dashboards" \ "$STAGE/private/argus/metric/grafana/config" # 5) Manifest & checksums gen_manifest "$STAGE" "$STAGE/manifest.txt" checksum_dir "$STAGE" "$STAGE/checksums.txt" # 6) Move to artifact dir and pack mkdir -p "$PKG_DIR" copy_tree "$STAGE" "$PKG_DIR" OUT_TAR_DIR="$(dirname "$PKG_DIR")" OUT_TAR="$OUT_TAR_DIR/server_arm_${VERSION}.tar.gz" log "Creating tarball: $OUT_TAR" (cd "$PKG_DIR/.." && tar -czf "$OUT_TAR" "$(basename "$PKG_DIR")") log "ARM Server package ready: $PKG_DIR" echo "$OUT_TAR"