deploy.sh
#!/bin/bash
# ==============================================================================
# Shell 脚本:自动构建、标记并推送 Docker 镜像到 Harbor/Registry
# ==============================================================================
# --- 配置区 ---
# 将这些变量修改为你自己的配置
# 1. 远程 Registry (Harbor) 地址
REGISTRY_URL="sit-registry.faw.cn"
# 2. Harbor 中的项目名称
PROJECT_NAME="dy_sa-0214_yxgzt"
# 3. 远端镜像名称
REMOTE_IMAGE_NAME="sa-0214_app_tsk_fe"
# 4. 本地镜像名称 (可以自定义)
LOCAL_IMAGE_NAME="tsk-sit"
# 5. 固定的标签前缀
TAG_PREFIX="tsk-sit"
# --- 脚本核心逻辑 ---
# 步骤 0: 确保脚本在任何命令失败时立即退出
# set -e 是一种安全机制,防止错误发生后继续执行后续命令
set -e
echo "npm打包中..."
npm run build-sit
echo "🚀 开始部署流程..."
# 步骤 1: 自动生成版本号
# 使用日期和时间(YYYYMMDD-HHMMSS)作为唯一的版本号,例如:20250903-165030
VERSION=$(date "+%Y%m%d-%H%M%S")
FULL_TAG="${TAG_PREFIX}${VERSION}"
echo "🔧 生成的唯一标签为: ${FULL_TAG}"
# 步骤 2: 执行前端构建命令
# 这是脚本的前置依赖,确保最新的代码被打包
echo "📦 正在执行 npm run build-sit..."
npm run build-sit
echo "✅ 构建完成。"
# 步骤 3: 构建本地 Docker 镜像
# 使用项目本地的 Dockerfile
# 我们给本地镜像也打上新生成的唯一标签,方便追踪
echo "🔨 正在构建本地 Docker 镜像: ${LOCAL_IMAGE_NAME}:${VERSION}..."
docker build -t "${LOCAL_IMAGE_NAME}:${VERSION}" .
echo "✅ 本地镜像构建成功。"
# 步骤 4: 为镜像打上符合远程仓库规范的标签
# 格式: <registry_url>/<project_name>/<image_name>:<tag>
REMOTE_IMAGE_FULL_NAME="${REGISTRY_URL}/${PROJECT_NAME}/${REMOTE_IMAGE_NAME}:${FULL_TAG}"
echo "🏷️ 正在为镜像打上远程标签: ${REMOTE_IMAGE_FULL_NAME}..."
docker tag "${LOCAL_IMAGE_NAME}:${VERSION}" "${REMOTE_IMAGE_FULL_NAME}"
echo "✅ 标签设置成功。"
# 步骤 5: 推送镜像到远程仓库
echo "⏫ 正在推送镜像到远程仓库..."
docker push "${REMOTE_IMAGE_FULL_NAME}"
echo "✅ 镜像推送成功。"
# 步骤 6: (可选) 清理本地的旧镜像
# 为了防止本地 Docker 镜像过多,可以清理刚刚推送的镜像
# docker rmi "${LOCAL_IMAGE_NAME}:${VERSION}"
# docker rmi "${REMOTE_IMAGE_FULL_NAME}"
# echo "🧹 已清理本地临时镜像。"
echo "🎉 部署流程全部完成!"
echo "镜像地址: ${REMOTE_IMAGE_FULL_NAME}"
Dockerfile
# 1. 指定基础镜像
# 这行和流水线中的“基础镜像”设置完全对应。
FROM registry.faw.cn/security/nginx:stable-alpine
# 2. 将构建好的前端静态文件(通常在 dist 目录)复制到 Nginx 的默认网站根目录。
# Nginx 镜像的默认网站根目录是 /usr/share/nginx/html
# COPY <源路径> <目标路径>
COPY dist/ /usr/share/nginx/html/
# 3. 设置工作目录(可选,但与流水线行为保持一致)
# 这行命令将容器内后续命令的执行目录设置为 Nginx 的网站根目录。
WORKDIR /usr/share/nginx/html