#!/usr/bin/env bash set -euo pipefail # Make client GPU package (versioned gpu bundle image, compose, env, docs, busybox) ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" TEMPL_DIR="$ROOT_DIR/deployment_new/templates/client_gpu" ART_ROOT="$ROOT_DIR/deployment_new/artifact/client_gpu" # Use deployment_new local common helpers COMMON_SH="$ROOT_DIR/deployment_new/build/common.sh" . "$COMMON_SH" usage(){ cat </ and client_gpu_YYYYMMDD.tar.gz EOF } VERSION="" IMAGE="argus-sys-metric-test-node-bundle-gpu:latest" while [[ $# -gt 0 ]]; do case "$1" in --version) VERSION="$2"; shift 2;; --image) IMAGE="$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 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 GPU bundle image with version tag if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then err "missing image: $IMAGE"; exit 1; fi REPO="${IMAGE%%:*}"; TAG_VER="$REPO:$VERSION" docker tag "$IMAGE" "$TAG_VER" out_tar="$STAGE/images/${REPO//\//-}-$VERSION.tar" docker save -o "$out_tar" "$TAG_VER" gzip -f "$out_tar" # 2) Busybox tar for connectivity/overlay warmup (prefer local template; fallback to docker save) BB_SRC="$TEMPL_DIR/images/busybox.tar" if [[ -f "$BB_SRC" ]]; then cp "$BB_SRC" "$STAGE/images/busybox.tar" else if docker image inspect busybox:latest >/dev/null 2>&1 || docker pull busybox:latest >/dev/null 2>&1; then docker save -o "$STAGE/images/busybox.tar" busybox:latest log "Included busybox from local docker daemon" else warn "busybox image not found and cannot pull; skipping busybox.tar" fi fi # 3) Compose + env template and docs/scripts from templates cp "$TEMPL_DIR/compose/docker-compose.yml" "$STAGE/compose/docker-compose.yml" ENV_EX="$STAGE/compose/.env.example" cat >"$ENV_EX" </dev/null 2>&1 || cp -r "$CLIENT_DOC_SRC/." "$STAGE/docs/" fi # Placeholder scripts (will be implemented in M2) cat >"$STAGE/scripts/README.md" <<'EOF' # Client-GPU Scripts (Placeholder) 本目录将在 M2 引入: - config.sh / install.sh 当前为占位,便于包结构审阅。 EOF # 5) Scripts (from deployment_new templates) and Private skeleton SCRIPTS_SRC="$TEMPL_DIR/scripts" if [[ -d "$SCRIPTS_SRC" ]]; then rsync -a "$SCRIPTS_SRC/" "$STAGE/scripts/" >/dev/null 2>&1 || cp -r "$SCRIPTS_SRC/." "$STAGE/scripts/" find "$STAGE/scripts" -type f -name '*.sh' -exec chmod +x {} + 2>/dev/null || true fi mkdir -p "$STAGE/private/argus/agent" # 6) Manifest & checksums gen_manifest "$STAGE" "$STAGE/manifest.txt" checksum_dir "$STAGE" "$STAGE/checksums.txt" # 7) Move to artifact dir and pack mkdir -p "$PKG_DIR" rsync -a "$STAGE/" "$PKG_DIR/" >/dev/null 2>&1 || cp -r "$STAGE/." "$PKG_DIR/" OUT_TAR_DIR="$(dirname "$PKG_DIR")" OUT_TAR="$OUT_TAR_DIR/client_gpu_${VERSION}.tar.gz" log "Creating tarball: $OUT_TAR" (cd "$PKG_DIR/.." && tar -czf "$OUT_TAR" "$(basename "$PKG_DIR")") log "Client-GPU package ready: $PKG_DIR" echo "$OUT_TAR"