From 7ef4639029b44f0217f35554108dd75f4db36cb0 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 30 Jul 2026 21:52:18 +0800 Subject: [PATCH] ci: add test environment client deployment --- .dockerignore | 9 ++++++++ Dockerfile | 27 +++++++++++++++++++++++ Jenkinsfile | 43 +++++++++++++++++++++++++++++++++++++ docker-compose.test.yml | 13 +++++++++++ nginx/default.conf.template | 28 ++++++++++++++++++++++++ 5 files changed, 120 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile create mode 100644 Jenkinsfile create mode 100644 docker-compose.test.yml create mode 100644 nginx/default.conf.template diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..0241e51 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.git +.playwright-cli +.impeccable +dist +node_modules +node_modules.broken-by-path +.env.local +npm-debug.log* +pnpm-debug.log* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..cf4ef81 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,27 @@ +# 构建 Vue 静态文件 +FROM node:22-alpine AS build + +WORKDIR /app + +# Corepack 与 pnpm 依赖均通过 npmmirror 下载,避免构建时访问 npm 官方源过慢。 +ENV COREPACK_NPM_REGISTRY=https://registry.npmmirror.com +ENV NPM_CONFIG_REGISTRY=https://registry.npmmirror.com +RUN corepack enable + +COPY package.json pnpm-lock.yaml ./ +COPY shared/package.json ./shared/package.json + +# package.json 和 lock 文件未变化时,这一层会由 Docker 自动复用。 +RUN pnpm config set registry https://registry.npmmirror.com && \ + pnpm install --frozen-lockfile + +COPY . . +RUN pnpm test && pnpm build + +# 运行阶段仅保留构建产物与 Nginx。 +FROM nginx:1.27-alpine + +COPY nginx/default.conf.template /etc/nginx/templates/default.conf.template +COPY --from=build /app/dist /usr/share/nginx/html + +EXPOSE 80 diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..1cfdd2e --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,43 @@ +pipeline { + agent any + + options { + timestamps() + disableConcurrentBuilds() + } + + stages { + stage('确认提交版本') { + steps { + sh 'echo "Jenkins 已拉取 release/test 分支代码"' + sh 'git log -1 --oneline' + } + } + + stage('构建并部署测试前端') { + steps { + sh ''' + set -eu + docker compose -f docker-compose.test.yml build --pull=false + docker compose -f docker-compose.test.yml up -d --remove-orphans + ''' + } + } + + stage('部署检查') { + steps { + sh ''' + set -eu + docker compose -f docker-compose.test.yml ps + docker compose -f docker-compose.test.yml exec -T client-web wget -qO- http://127.0.0.1/healthz + ''' + } + } + } + + post { + failure { + sh 'docker compose -f docker-compose.test.yml logs --tail=100 || true' + } + } +} diff --git a/docker-compose.test.yml b/docker-compose.test.yml new file mode 100644 index 0000000..fc0ef66 --- /dev/null +++ b/docker-compose.test.yml @@ -0,0 +1,13 @@ +services: + client-web: + build: + context: . + dockerfile: Dockerfile + image: client-web-test:local + container_name: client-web-test + restart: unless-stopped + ports: + - "${HOST_PORT:-9002}:80" + environment: + # 测试环境 Gateway;迁移环境时可由 Jenkins 环境变量覆盖。 + API_UPSTREAM: "${API_UPSTREAM:-http://8.163.30.128:9000}" diff --git a/nginx/default.conf.template b/nginx/default.conf.template new file mode 100644 index 0000000..581c6a5 --- /dev/null +++ b/nginx/default.conf.template @@ -0,0 +1,28 @@ +server { + listen 80; + listen [::]:80; + server_name _; + + root /usr/share/nginx/html; + index index.html; + + location = /healthz { + default_type text/plain; + return 200 "ok\n"; + } + + # 前端统一请求 /api,保持原始路径转发给 Gateway。 + location /api/ { + proxy_pass ${API_UPSTREAM}; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + # 支持 Vue Router history 路由直接刷新。 + location / { + try_files $uri $uri/ /index.html; + } +}