#!/usr/bin/env bash # install.sh — 离线安装 AgentKit(加载镜像 + helm install) # 用法:bash install.sh [DIST_DIR] [NAMESPACE] [RELEASE_NAME] # 前置:已将 dist/ 拷贝到离线集群节点,节点已安装 docker + helm + kubectl。 set -euo pipefail DIST_DIR="${1:-dist}" NAMESPACE="${2:-agentkit}" RELEASE="${3:-agentkit}" SCRIPT_DIR="$(cd "$(dirname "$0")/.." && pwd)" cd "${SCRIPT_DIR}" echo "==> 检查依赖" for cmd in docker helm kubectl; do if ! command -v "$cmd" >/dev/null 2>&1; then echo "ERROR: ${cmd} 未安装" >&2 exit 1 fi done if [ ! -d "${DIST_DIR}" ]; then echo "ERROR: 产物目录不存在:${DIST_DIR}" >&2 echo " 请先在联网环境执行 make all,并将 dist/ 拷贝到本节点。" >&2 exit 1 fi # 1) 加载镜像 tarball IMAGE_TARBALL="$(ls "${DIST_DIR}"/agentkit-image-*.tar.gz 2>/dev/null | head -1 || true)" if [ -z "${IMAGE_TARBALL}" ]; then echo "ERROR: 镜像 tarball 未找到(${DIST_DIR}/agentkit-image-*.tar.gz)" >&2 exit 1 fi echo "==> 加载镜像:${IMAGE_TARBALL}" gunzip -c "${IMAGE_TARBALL}" | docker load # 列出刚加载的镜像(便于校验 tag) LOADED_IMAGE="$(docker images --format '{{.Repository}}:{{.Tag}}' | grep agentkit | head -1)" echo " 已加载:${LOADED_IMAGE}" # 2) helm install CHART_TGZ="$(ls "${DIST_DIR}"/agentkit-*.tgz 2>/dev/null | grep -v agentkit-image | head -1 || true)" if [ -z "${CHART_TGZ}" ]; then echo "ERROR: chart tgz 未找到(${DIST_DIR}/agentkit-*.tgz)" >&2 exit 1 fi echo "==> 创建 namespace:${NAMESPACE}" kubectl get namespace "${NAMESPACE}" >/dev/null 2>&1 || \ kubectl create namespace "${NAMESPACE}" echo "==> helm install:${RELEASE} (namespace=${NAMESPACE})" helm upgrade --install "${RELEASE}" "${CHART_TGZ}" \ --namespace "${NAMESPACE}" \ --set image.repository="$(echo "${LOADED_IMAGE}" | cut -d: -f1)" \ --set image.tag="$(echo "${LOADED_IMAGE}" | cut -d: -f2)" \ --set image.pullPolicy=Never # 离线本地镜像,Never 强制使用已加载的本地镜像 echo "==> 等待 rollout" # DEPLOY-1: 用标签选择器定位 Deployment — fullname 在 release 名包含 chart 名时 # 仅返回 release 名(如 release=agentkit → Deployment=agentkit),其他情况返回 # release-chart(如 release=myprod → myprod-agentkit)。硬编码 "${RELEASE}-agentkit" # 在默认 release=agentkit 时拼出不存在的 agentkit-agentkit。改用 instance 标签。 kubectl rollout status deployment -l app.kubernetes.io/instance="${RELEASE}" -n "${NAMESPACE}" --timeout=300s || \ echo "WARN: rollout 未在 300s 内完成,请检查 pod 状态:kubectl get pods -n ${NAMESPACE}" echo "==> 完成。验证:" echo " kubectl get pods -n ${NAMESPACE}" echo " kubectl get ingress -n ${NAMESPACE}" echo " helm status ${RELEASE} -n ${NAMESPACE}"