109 lines
5.0 KiB
Bash
Executable File
109 lines
5.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# =============================================================================
|
||
# CloudSearch · 构建、推送镜像 & 发布 Release
|
||
# =============================================================================
|
||
#
|
||
# 用法:
|
||
# ./scripts/build-and-push.sh [版本号]
|
||
#
|
||
# 示例:
|
||
# ./scripts/build-and-push.sh v0.3.32 # 指定版本
|
||
# ./scripts/build-and-push.sh # 自动读取 VERSION 文件
|
||
#
|
||
# 前置要求:
|
||
# - Docker 已安装
|
||
# - 已登录 Gitea 容器注册表:docker login gitea.timxx.cn
|
||
# - Git 仓库已配置 remote
|
||
#
|
||
# =============================================================================
|
||
|
||
set -euo pipefail
|
||
|
||
# ── 配置 ────────────────────────────────────────────────────────────────────
|
||
REGISTRY="gitea.timxx.cn"
|
||
NAMESPACE="admin"
|
||
IMAGE_NAME="cloudsearch"
|
||
BUILD_DIR="$(cd "$(dirname "$0")/.." && pwd)"
|
||
SCRIPTS_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||
|
||
# ── 版本号 ──────────────────────────────────────────────────────────────────
|
||
if [[ -n "${1:-}" ]]; then
|
||
VERSION="$1"
|
||
# 去掉 v 前缀(如果有),统一格式
|
||
VERSION="${VERSION#v}"
|
||
else
|
||
# 从 VERSION 文件读取
|
||
VERSION_FILE="$BUILD_DIR/VERSION"
|
||
if [[ ! -f "$VERSION_FILE" ]]; then
|
||
echo "❌ VERSION 文件不存在,请指定版本号:$0 vX.Y.Z"
|
||
exit 1
|
||
fi
|
||
VERSION="$(cat "$VERSION_FILE")"
|
||
fi
|
||
|
||
FULL_TAG="${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:v${VERSION}"
|
||
LATEST_TAG="${REGISTRY}/${NAMESPACE}/${IMAGE_NAME}:latest"
|
||
LOCAL_TAG="cloudsearch-app:v${VERSION}"
|
||
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo " CloudSearch 构建 & 发布"
|
||
echo " 版本: v${VERSION}"
|
||
echo " 镜像: ${FULL_TAG}"
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo ""
|
||
|
||
# ── 1. 更新 VERSION 文件 ───────────────────────────────────────────────────
|
||
echo "📝 [1/5] 更新 VERSION 文件..."
|
||
echo "$VERSION" > "$VERSION_FILE"
|
||
echo " VERSION → $(cat $VERSION_FILE)"
|
||
|
||
# ── 2. 构建 Docker 镜像 ─────────────────────────────────────────────────────
|
||
echo ""
|
||
echo "🔨 [2/5] 构建 Docker 镜像..."
|
||
cd "$BUILD_DIR/source_clean"
|
||
docker build \
|
||
-t "$LOCAL_TAG" \
|
||
-t "cloudsearch-app:latest" \
|
||
.
|
||
echo " ✅ 本地镜像构建完成: $LOCAL_TAG"
|
||
|
||
# ── 3. 标记镜像 ─────────────────────────────────────────────────────────────
|
||
echo ""
|
||
echo "🏷️ [3/5] 标记镜像..."
|
||
docker tag "cloudsearch-app:latest" "$FULL_TAG"
|
||
docker tag "cloudsearch-app:latest" "$LATEST_TAG"
|
||
echo " $FULL_TAG"
|
||
echo " $LATEST_TAG"
|
||
|
||
# ── 4. 推送镜像 ─────────────────────────────────────────────────────────────
|
||
echo ""
|
||
echo "📤 [4/5] 推送镜像到私有仓库..."
|
||
docker push "$FULL_TAG"
|
||
docker push "$LATEST_TAG"
|
||
echo " ✅ 推送完成"
|
||
|
||
# ── 5. 创建 Git 标签 ───────────────────────────────────────────────────────
|
||
echo ""
|
||
echo "🏷️ [5/5] 创建 Git 标签..."
|
||
cd "$BUILD_DIR"
|
||
git add VERSION
|
||
git commit -m "release: v${VERSION}" || echo " (无变更,跳过 commit)"
|
||
git tag -a "v${VERSION}" -m "Release v${VERSION}"
|
||
echo " 标签 v${VERSION} 已创建(稍后 git push --tags)"
|
||
|
||
# ── 完成 ────────────────────────────────────────────────────────────────────
|
||
echo ""
|
||
echo "═══════════════════════════════════════════════════════════"
|
||
echo " ✅ 发布完成!"
|
||
echo ""
|
||
echo " 推送到远程:"
|
||
echo " git push origin master --tags"
|
||
echo ""
|
||
echo " 生产部署:"
|
||
echo " docker pull ${FULL_TAG}"
|
||
echo " docker compose up -d app"
|
||
echo ""
|
||
echo " 验证:"
|
||
echo " curl -s http://localhost:9527/health | jq .version"
|
||
echo "═══════════════════════════════════════════════════════════"
|