69 lines
2.8 KiB
Bash
Executable File
69 lines
2.8 KiB
Bash
Executable File
#!/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}"
|