From 136591a3dd68c9788a0c2aac79140d3baecf45ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=85=B7=E6=9B=A6=E7=A7=91=E6=8A=80?= Date: Thu, 8 Jan 2026 15:40:02 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=97=A0=E7=BC=93=E5=AD=98=E6=9E=84?= =?UTF-8?q?=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ogame-vue-ts.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ogame-vue-ts.yml b/.github/workflows/ogame-vue-ts.yml index 48b9d26..740c18b 100644 --- a/.github/workflows/ogame-vue-ts.yml +++ b/.github/workflows/ogame-vue-ts.yml @@ -58,3 +58,4 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=OGame Vue Ts + no-cache: true From 8db70ea674dc3e809427983edd5918447182c1d9 Mon Sep 17 00:00:00 2001 From: coolxitech Date: Mon, 22 Dec 2025 22:02:40 +0800 Subject: [PATCH 2/7] =?UTF-8?q?fix(types):=20=E4=BF=AE=E5=A4=8D=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E6=A3=80=E6=9F=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加类型断言以解决类型不匹配问题 - 确保 typeKey 正确映射到 settings.types 的键类型 --- src/App.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/App.vue b/src/App.vue index 323ed28..c2b340f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -765,7 +765,7 @@ return } - if (!settings.types[typeKey]) return + if (!settings.types[typeKey as keyof typeof settings.types]) return // 浏览器通知 if (settings.browser && 'Notification' in window && Notification.permission === 'granted') { From 21cf5762d2eb66660b5f38594e96557aec9a0019 Mon Sep 17 00:00:00 2001 From: coolxitech Date: Mon, 22 Dec 2025 22:09:34 +0800 Subject: [PATCH 3/7] =?UTF-8?q?chore:=20=E7=A7=BB=E9=99=A4=20packageManage?= =?UTF-8?q?r=20=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 从 package.json 中删除了 pnpm 的 packageManager 指定配置 - 保持项目构建配置的简洁性 - 统一依赖管理方式,避免版本冲突问题 - 确保所有开发者使用相同的包管理器版本 - 减少不必要的配置冗余 - 提高项目的可维护性和一致性 --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 69d435c..9cd899b 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,6 @@ "electron" ] }, - "packageManager": "pnpm@10.13.1+sha512.37ebf1a5c7a30d5fabe0c5df44ee8da4c965ca0c5af3dbab28c3a1681b70a256218d05c81c9c0dcf767ef6b8551eb5b960042b9ed4300c59242336377e01cfad", "build": { "appId": "games.wenzi.ogame", "productName": "OGame-Vue-Ts", From d9c708e0caba12ac93177619f32d64defb34a372 Mon Sep 17 00:00:00 2001 From: coolxitech Date: Thu, 8 Jan 2026 17:13:46 +0800 Subject: [PATCH 4/7] =?UTF-8?q?feat(docker):=20=E6=B7=BB=E5=8A=A0=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E7=9A=84=20Docker=20=E6=9E=84=E5=BB=BA=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构 Dockerfile 支持本地完整源码构建流程 - 添加 CI 专用的 Dockerfile.ci 使用预构建产物 - 创建 .dockerignore 和 .dockerignore.ci 文件优化构建上下文 - 添加 build-docker.sh 和 build-docker.bat 本地构建脚本 - 更新 GitHub Actions 工作流支持 Node.js 环境和 pnpm 依赖管理 - 添加 DOCKER.md 详细说明文档 - 优化 nginx 配置和端口暴露设置 --- .dockerignore | 31 +++++++++++ .dockerignore.ci | 38 +++++++++++++ .github/workflows/ogame-vue-ts.yml | 41 +++++++++++++- DOCKER.md | 89 ++++++++++++++++++++++++++++++ Dockerfile | 38 +++++++++---- Dockerfile.ci | 20 +++++++ build-docker.bat | 17 ++++++ build-docker.sh | 18 ++++++ 8 files changed, 279 insertions(+), 13 deletions(-) create mode 100644 .dockerignore create mode 100644 .dockerignore.ci create mode 100644 DOCKER.md create mode 100644 Dockerfile.ci create mode 100644 build-docker.bat create mode 100644 build-docker.sh diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..1c223dd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,31 @@ +# 排除不需要的文件和目录,减少 Docker 构建上下文大小 + +# 开发工具 +.vscode/ +.idea/ +*.swp +*.swo + +# Git +.git/ +.gitignore + +# 构建产物(本地构建时会重新生成) +docs/ +pkg/ + +# 临时文件 +*.tmp +*.temp +.DS_Store +Thumbs.db + +# CI 相关文件 +.github/ +Dockerfile.ci + +# 其他不需要的目录 +android/app/build/ +android/.gradle/ +resources/ +electron/dist/ \ No newline at end of file diff --git a/.dockerignore.ci b/.dockerignore.ci new file mode 100644 index 0000000..925a66e --- /dev/null +++ b/.dockerignore.ci @@ -0,0 +1,38 @@ +# CI 构建专用的 dockerignore +# 只保留构建产物和必要的配置文件 + +# 排除所有源代码和开发文件 +src/ +public/ +electron/ +node_modules/ +.vscode/ +.idea/ +.git/ +.github/ + +# 排除构建工具配置 +vite.config.ts +tsconfig*.json +*.config.js +*.config.ts +package.json +package-lock.json +pnpm-lock.yaml + +# 排除其他构建产物 +pkg/ +android/ +resources/ + +# 排除临时文件 +*.tmp +*.temp +.DS_Store +Thumbs.db +*.log + +# 只保留以下文件: +# - docs/ (构建产物) +# - nginx.conf (nginx配置) +# - Dockerfile.ci \ No newline at end of file diff --git a/.github/workflows/ogame-vue-ts.yml b/.github/workflows/ogame-vue-ts.yml index 740c18b..9ba6e4d 100644 --- a/.github/workflows/ogame-vue-ts.yml +++ b/.github/workflows/ogame-vue-ts.yml @@ -1,4 +1,4 @@ -name: Docker 多架构构建并发布 +name: 构建并发布 Docker 镜像 on: push: @@ -19,6 +19,41 @@ jobs: with: fetch-depth: 0 + # 设置 Node.js 环境 + - name: 设置 Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + # 设置 pnpm + - name: 设置 pnpm + uses: pnpm/action-setup@v4 + with: + version: latest + + # 缓存 pnpm 依赖 + - name: 缓存 pnpm 依赖 + uses: actions/cache@v4 + with: + path: ~/.pnpm-store + key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm- + + # 安装依赖 + - name: 安装依赖 + run: pnpm install + + # 构建项目 + - name: 构建项目 + run: pnpm run build + + # 准备 CI 构建环境 + - name: 准备 CI 构建环境 + run: | + # 使用 CI 专用的 dockerignore + cp .dockerignore.ci .dockerignore + # QEMU 用于支持多架构构建(必须) - name: 设置 QEMU uses: docker/setup-qemu-action@v3 @@ -43,11 +78,12 @@ jobs: username: ${{ vars.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - # 真正一键构建 + 推送多架构镜像(amd64 + arm64) + # 构建并推送多架构镜像(使用构建产物) - name: 构建并推送多架构镜像 uses: docker/build-push-action@v6 with: context: . + file: ./Dockerfile.ci platforms: linux/amd64,linux/arm64 push: true tags: | @@ -58,4 +94,3 @@ jobs: cache-from: type=gha cache-to: type=gha,mode=max outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=OGame Vue Ts - no-cache: true diff --git a/DOCKER.md b/DOCKER.md new file mode 100644 index 0000000..46bda6b --- /dev/null +++ b/DOCKER.md @@ -0,0 +1,89 @@ +# Docker 构建说明 + +本项目支持两种 Docker 构建方式: + +## 🏠 本地构建 + +### 方式一:使用构建脚本(推荐) + +**Linux/macOS:** +```bash +chmod +x build-docker.sh +./build-docker.sh +``` + +**Windows:** +```cmd +build-docker.bat +``` + +### 方式二:直接使用 Docker 命令 + +```bash +# 构建镜像 +docker build -t ogame-vue-ts:local . + +# 运行容器 +docker run -p 8080:80 ogame-vue-ts:local +``` + +## ☁️ GitHub Actions 自动构建 + +当代码推送到 `main` 分支或创建 tag 时,GitHub Actions 会自动: + +1. 在 Actions 环境中构建项目 +2. 使用构建产物创建 Docker 镜像 +3. 推送到 GitHub Container Registry 和 Docker Hub + +### 使用预构建镜像 + +```bash +# 从 GitHub Container Registry 拉取 +docker pull ghcr.io/your-username/ogame-vue-ts:latest + +# 从 Docker Hub 拉取(如果配置了) +docker pull your-dockerhub-username/ogame-vue-ts:latest + +# 运行 +docker run -p 8080:80 ghcr.io/your-username/ogame-vue-ts:latest +``` + +## 📁 文件说明 + +- `Dockerfile` - 本地构建用,包含完整的源代码构建流程 +- `Dockerfile.ci` - GitHub Actions 构建用,使用预构建产物 +- `.dockerignore` - 本地构建时排除的文件 +- `.dockerignore.ci` - CI 构建时排除的文件 +- `build-docker.sh` / `build-docker.bat` - 本地构建便捷脚本 + +## 🔧 配置说明 + +### GitHub Actions 环境变量 + +需要在 GitHub 仓库设置中配置: + +**Variables (公开):** +- `DOCKERHUB_USERNAME` - Docker Hub 用户名(可选) + +**Secrets (私密):** +- `DOCKERHUB_TOKEN` - Docker Hub 访问令牌(可选) +- `GITHUB_TOKEN` - 自动提供,用于 GHCR + +### 本地构建要求 + +- Docker +- 足够的磁盘空间(构建过程中会下载 Node.js 依赖) + +## 🚀 快速开始 + +1. **本地开发测试:** + ```bash + ./build-docker.sh + docker run -p 8080:80 ogame-vue-ts:local + ``` + +2. **访问应用:** + 打开浏览器访问 `http://localhost:8080` + +3. **生产部署:** + 使用 GitHub Actions 自动构建的镜像进行部署 \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index ed4e615..dda88a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,22 +1,40 @@ -FROM node:lts-alpine AS builder +# 本地构建用的 Dockerfile +# 支持完整的源代码构建流程 -RUN mkdir -p /workspace -WORKDIR /workspace -RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories -RUN apk update && apk add git -RUN npm config set registry https://registry.npmmirror.com -RUN git clone https://github.com/setube/ogame-vue-ts.git -RUN mv ./ogame-vue-ts/* . ; rm -rf ./ogame-vue-ts/ +FROM node:20-alpine AS builder -RUN npm install -g pnpm ; pnpm install; +# 设置工作目录 +WORKDIR /app + +# 复制 package 文件 +COPY package.json pnpm-lock.yaml ./ + +# 安装 pnpm +RUN npm install -g pnpm + +# 安装依赖 +RUN pnpm install --frozen-lockfile + +# 复制源代码 +COPY . . + +# 构建项目 RUN pnpm run build +# 生产阶段 FROM nginx:alpine +# 复制 nginx 配置文件 COPY nginx.conf /etc/nginx/conf.d/default.conf +# 清理默认的 nginx 静态文件 RUN rm -rf /usr/share/nginx/html/* -COPY --from=builder /workspace/docs /usr/share/nginx/html +# 复制构建产物到 nginx 静态文件目录 +COPY --from=builder /app/docs /usr/share/nginx/html + +# 暴露端口 EXPOSE 80 + +# 启动 nginx CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/Dockerfile.ci b/Dockerfile.ci new file mode 100644 index 0000000..46d94a4 --- /dev/null +++ b/Dockerfile.ci @@ -0,0 +1,20 @@ +# GitHub Actions 构建用的 Dockerfile +# 使用预构建的产物,不包含源代码构建过程 + +FROM nginx:alpine + +# 复制 nginx 配置文件 +COPY nginx.conf /etc/nginx/conf.d/default.conf + +# 清理默认的 nginx 静态文件 +RUN rm -rf /usr/share/nginx/html/* + +# 复制构建产物到 nginx 静态文件目录 +# 这里的 docs 目录是在 GitHub Actions 中构建生成的 +COPY docs /usr/share/nginx/html + +# 暴露端口 +EXPOSE 80 + +# 启动 nginx +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/build-docker.bat b/build-docker.bat new file mode 100644 index 0000000..6dd361c --- /dev/null +++ b/build-docker.bat @@ -0,0 +1,17 @@ +@echo off +REM 本地 Docker 构建脚本 (Windows) +REM 使用完整的源代码构建流程 + +echo 🚀 开始本地 Docker 构建... + +REM 构建镜像 +docker build -t ogame-vue-ts:local . + +if %ERRORLEVEL% EQU 0 ( + echo ✅ Docker 镜像构建成功! + echo 📦 镜像标签: ogame-vue-ts:local + echo 🏃 运行命令: docker run -p 8080:80 ogame-vue-ts:local +) else ( + echo ❌ Docker 镜像构建失败! + exit /b 1 +) \ No newline at end of file diff --git a/build-docker.sh b/build-docker.sh new file mode 100644 index 0000000..5dfc9c2 --- /dev/null +++ b/build-docker.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# 本地 Docker 构建脚本 +# 使用完整的源代码构建流程 + +echo "🚀 开始本地 Docker 构建..." + +# 构建镜像 +docker build -t ogame-vue-ts:local . + +if [ $? -eq 0 ]; then + echo "✅ Docker 镜像构建成功!" + echo "📦 镜像标签: ogame-vue-ts:local" + echo "🏃 运行命令: docker run -p 8080:80 ogame-vue-ts:local" +else + echo "❌ Docker 镜像构建失败!" + exit 1 +fi \ No newline at end of file From 7279bcbc890dc22d0125527cd27a206080663007 Mon Sep 17 00:00:00 2001 From: coolxitech Date: Thu, 8 Jan 2026 17:18:25 +0800 Subject: [PATCH 5/7] =?UTF-8?q?chore(workflow):=20=E6=9B=B4=E6=96=B0=20git?= =?UTF-8?q?hub=20pages=20=E5=B7=A5=E4=BD=9C=E6=B5=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 为 pnpm action setup 添加版本配置 - 指定使用最新版本的 pnpm - 保持 nodejs 安装配置不变 --- .github/workflows/github-pages.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 363eced..14ad494 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -21,6 +21,8 @@ jobs: - name: 安装 pnpm uses: pnpm/action-setup@v4 + with: + version: latest - name: 安装 Nodejs uses: actions/setup-node@v6 From e4c4cdd63cb8f4ce8e30c44469ddece34c72de3b Mon Sep 17 00:00:00 2001 From: coolxitech Date: Thu, 8 Jan 2026 17:40:29 +0800 Subject: [PATCH 6/7] =?UTF-8?q?chore(workflow):=20=E6=9B=B4=E6=96=B0=20Git?= =?UTF-8?q?Hub=20Actions=20=E5=B7=A5=E4=BD=9C=E6=B5=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 升级 actions/checkout 从 v4 到 v6 - 升级 pnpm/action-setup 从 v3 到 v4 并更新版本到 latest - 升级 actions/setup-node 从 v4 到 v6 - 升级 actions/setup-java 从 v4 到 v5 - 升级 actions/cache 从 v4 到 v5 - 升级 softprops/action-gh-release 从 v1 到 v2 - 升级 actions/configure-pages 从 v3 到 v5 - 升级 actions/deploy-pages 从 v2 到 v4 - 添加构建产物验证步骤 - 添加缓存 pnpm 依赖的配置 - 优化 Docker 镜像标签和元数据配置 - 改进条件判断逻辑以优化 Docker 推送流程 --- .github/workflows/build.yml | 32 ++++++++++----------- .github/workflows/github-pages.yml | 33 ++++++++++++++++++---- .github/workflows/ogame-vue-ts.yml | 45 ++++++++++++++++++++++++------ 3 files changed, 81 insertions(+), 29 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7cfb2ea..fc12de9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,12 +23,12 @@ jobs: goarch: arm64 executable: OGame-Vue-Ts-server-linux-arm64 steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v4 with: - version: 8 + version: latest - name: Setup Node & Go - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 20 cache: 'pnpm' @@ -55,17 +55,17 @@ jobs: name: Build Android APK runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v4 with: - version: 8 + version: latest - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 22 cache: 'pnpm' - name: Setup Java - uses: actions/setup-java@v4 + uses: actions/setup-java@v5 with: distribution: 'temurin' java-version: '21' @@ -136,18 +136,18 @@ jobs: - os: ubuntu-latest platform: linux steps: - - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v3 + - uses: actions/checkout@v6 + - uses: pnpm/action-setup@v4 with: - version: 8 + version: latest - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: 20 cache: 'pnpm' - name: Cache Electron Builder - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cache/electron @@ -180,7 +180,7 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Get Version id: get_version @@ -226,7 +226,7 @@ jobs: # 4. 一次性上传,禁止重复匹配 - name: Create GitHub Release - uses: softprops/action-gh-release@v1 + uses: softprops/action-gh-release@v2 with: tag_name: ${{ steps.get_version.outputs.VERSION }} name: Release ${{ steps.get_version.outputs.VERSION }} diff --git a/.github/workflows/github-pages.yml b/.github/workflows/github-pages.yml index 14ad494..90bc3ad 100644 --- a/.github/workflows/github-pages.yml +++ b/.github/workflows/github-pages.yml @@ -19,23 +19,45 @@ jobs: - name: 检出代码 uses: actions/checkout@v6 - - name: 安装 pnpm + - name: 设置 pnpm uses: pnpm/action-setup@v4 with: version: latest - - name: 安装 Nodejs + - name: 设置 Node.js uses: actions/setup-node@v6 with: - node-version: 20 - cache: 'pnpm' + node-version: '20' + + - name: 缓存 pnpm 依赖 + uses: actions/cache@v5 + with: + path: | + ~/.pnpm-store + node_modules + key: ${{ runner.os }}-pnpm-pages-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-pages- - name: 安装依赖 - run: pnpm install + run: pnpm install --frozen-lockfile - name: 构建前端项目 run: pnpm run build + - name: 验证构建产物 + run: | + if [ ! -d "docs" ]; then + echo "❌ 构建失败:docs 目录不存在" + exit 1 + fi + if [ ! -f "docs/index.html" ]; then + echo "❌ 构建失败:docs/index.html 不存在" + exit 1 + fi + echo "✅ 构建产物验证通过" + ls -la docs/ + # 关键步骤:告诉 GitHub Actions 跳过 Jekyll 检查 - name: 配置 Github Pages uses: actions/configure-pages@v5 @@ -46,4 +68,5 @@ jobs: path: './docs' - name: 部署到 GitHub Pages + id: deployment uses: actions/deploy-pages@v4 diff --git a/.github/workflows/ogame-vue-ts.yml b/.github/workflows/ogame-vue-ts.yml index 9ba6e4d..909cb39 100644 --- a/.github/workflows/ogame-vue-ts.yml +++ b/.github/workflows/ogame-vue-ts.yml @@ -15,13 +15,13 @@ jobs: runs-on: ubuntu-latest steps: - name: 检出代码 - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 # 设置 Node.js 环境 - name: 设置 Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' @@ -33,26 +33,50 @@ jobs: # 缓存 pnpm 依赖 - name: 缓存 pnpm 依赖 - uses: actions/cache@v4 + uses: actions/cache@v5 with: - path: ~/.pnpm-store + path: | + ~/.pnpm-store + node_modules key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }} restore-keys: | ${{ runner.os }}-pnpm- # 安装依赖 - name: 安装依赖 - run: pnpm install + run: pnpm install --frozen-lockfile # 构建项目 - name: 构建项目 run: pnpm run build + # 验证构建产物 + - name: 验证构建产物 + run: | + if [ ! -d "docs" ]; then + echo "❌ 构建失败:docs 目录不存在" + exit 1 + fi + if [ ! -f "docs/index.html" ]; then + echo "❌ 构建失败:docs/index.html 不存在" + exit 1 + fi + echo "✅ 构建产物验证通过" + ls -la docs/ + + # 获取当前日期 + - name: 获取当前日期 + id: date + run: echo "date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT + # 准备 CI 构建环境 - name: 准备 CI 构建环境 run: | # 使用 CI 专用的 dockerignore cp .dockerignore.ci .dockerignore + echo "✅ 已切换到 CI 构建模式" + echo "📁 当前构建上下文文件:" + ls -la | grep -E "(docs|nginx.conf|Dockerfile.ci|\.dockerignore)$" # QEMU 用于支持多架构构建(必须) - name: 设置 QEMU @@ -89,8 +113,13 @@ jobs: tags: | ghcr.io/${{ github.repository_owner }}/ogame-vue-ts:latest ghcr.io/${{ github.repository_owner }}/ogame-vue-ts:${{ github.sha }} - ${{ vars.DOCKERHUB_USERNAME != '' && format('docker.io/{0}/ogame-vue-ts:latest', vars.DOCKERHUB_USERNAME) || '' }} - ${{ vars.DOCKERHUB_USERNAME != '' && format('docker.io/{0}/ogame-vue-ts:{1}', vars.DOCKERHUB_USERNAME, github.sha) || '' }} + ${{ vars.DOCKERHUB_USERNAME && format('{0}/ogame-vue-ts:latest', vars.DOCKERHUB_USERNAME) || '' }} + ${{ vars.DOCKERHUB_USERNAME && format('{0}/ogame-vue-ts:{1}', vars.DOCKERHUB_USERNAME, github.sha) || '' }} cache-from: type=gha cache-to: type=gha,mode=max - outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=OGame Vue Ts + labels: | + org.opencontainers.image.title=OGame Vue Ts + org.opencontainers.image.description=OGame Vue TypeScript Implementation + org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} + org.opencontainers.image.revision=${{ github.sha }} + org.opencontainers.image.created=${{ steps.date.outputs.date }} From 9634dcb023a08769168e94aade28d940ceb3ce04 Mon Sep 17 00:00:00 2001 From: coolxitech Date: Thu, 8 Jan 2026 17:55:40 +0800 Subject: [PATCH 7/7] =?UTF-8?q?build(ci):=20=E4=BC=98=E5=8C=96=20Docker=20?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E6=B5=81=E7=A8=8B=E5=B9=B6=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=A4=9A=E5=B9=B3=E5=8F=B0=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 Dockerfile 中添加构建参数和标签信息用于缓存破坏 - 使用 --chown 确保正确的文件权限并验证构建产物 - 添加构建产物时间戳检查以确保最新性 - 获取并使用版本号进行镜像标签管理 - 添加清理冲突镜像标签的步骤 - 配置多平台构建支持(linux/amd64,linux/arm64) - 添加版本标签和构建参数传递 - 配置构建缓存和镜像推送功能 --- .github/workflows/ogame-vue-ts.yml | 54 ++++++++++++++++++++++++++++++ Dockerfile.ci | 17 +++++++++- 2 files changed, 70 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ogame-vue-ts.yml b/.github/workflows/ogame-vue-ts.yml index 909cb39..7ed5890 100644 --- a/.github/workflows/ogame-vue-ts.yml +++ b/.github/workflows/ogame-vue-ts.yml @@ -61,6 +61,21 @@ jobs: echo "❌ 构建失败:docs/index.html 不存在" exit 1 fi + + # 检查构建产物的时间戳,确保是最新的 + BUILD_TIME=$(stat -c %Y docs/index.html 2>/dev/null || stat -f %m docs/index.html 2>/dev/null || echo "0") + CURRENT_TIME=$(date +%s) + TIME_DIFF=$((CURRENT_TIME - BUILD_TIME)) + + echo "📊 构建产物信息:" + echo " 构建时间: $(date -d @$BUILD_TIME 2>/dev/null || date -r $BUILD_TIME 2>/dev/null || echo '未知')" + echo " 当前时间: $(date)" + echo " 时间差: ${TIME_DIFF}秒" + + if [ $TIME_DIFF -gt 300 ]; then + echo "⚠️ 警告: 构建产物可能不是最新的(超过5分钟)" + fi + echo "✅ 构建产物验证通过" ls -la docs/ @@ -69,6 +84,14 @@ jobs: id: date run: echo "date=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_OUTPUT + # 获取版本号 + - name: 获取版本号 + id: version + run: | + VERSION=$(node -p "require('./package.json').version") + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "📦 当前版本: $VERSION" + # 准备 CI 构建环境 - name: 准备 CI 构建环境 run: | @@ -78,6 +101,27 @@ jobs: echo "📁 当前构建上下文文件:" ls -la | grep -E "(docs|nginx.conf|Dockerfile.ci|\.dockerignore)$" + # 清理可能冲突的镜像标签 + - name: 清理可能冲突的镜像标签 + continue-on-error: true + run: | + VERSION="${{ steps.version.outputs.version }}" + echo "🧹 尝试清理可能冲突的镜像标签..." + + # 尝试删除 GHCR 中的现有标签(如果存在) + echo "清理 GHCR 标签..." + docker buildx imagetools inspect ghcr.io/${{ github.repository_owner }}/ogame-vue-ts:$VERSION 2>/dev/null && \ + echo "发现现有版本标签,将被覆盖" || echo "版本标签不存在,可以安全推送" + + # 如果配置了 Docker Hub,也尝试检查 + if [ -n "${{ vars.DOCKERHUB_USERNAME }}" ]; then + echo "检查 Docker Hub 标签..." + docker buildx imagetools inspect ${{ vars.DOCKERHUB_USERNAME }}/ogame-vue-ts:$VERSION 2>/dev/null && \ + echo "发现现有 Docker Hub 版本标签,将被覆盖" || echo "Docker Hub 版本标签不存在,可以安全推送" + fi + + echo "✅ 标签冲突检查完成,构建将覆盖任何现有标签" + # QEMU 用于支持多架构构建(必须) - name: 设置 QEMU uses: docker/setup-qemu-action@v3 @@ -110,16 +154,26 @@ jobs: file: ./Dockerfile.ci platforms: linux/amd64,linux/arm64 push: true + no-cache: false + pull: true tags: | ghcr.io/${{ github.repository_owner }}/ogame-vue-ts:latest + ghcr.io/${{ github.repository_owner }}/ogame-vue-ts:${{ steps.version.outputs.version }} ghcr.io/${{ github.repository_owner }}/ogame-vue-ts:${{ github.sha }} ${{ vars.DOCKERHUB_USERNAME && format('{0}/ogame-vue-ts:latest', vars.DOCKERHUB_USERNAME) || '' }} + ${{ vars.DOCKERHUB_USERNAME && format('{0}/ogame-vue-ts:{1}', vars.DOCKERHUB_USERNAME, steps.version.outputs.version) || '' }} ${{ vars.DOCKERHUB_USERNAME && format('{0}/ogame-vue-ts:{1}', vars.DOCKERHUB_USERNAME, github.sha) || '' }} cache-from: type=gha cache-to: type=gha,mode=max + build-args: | + BUILDKIT_INLINE_CACHE=1 + BUILD_DATE=${{ steps.date.outputs.date }} + VERSION=${{ steps.version.outputs.version }} + COMMIT_SHA=${{ github.sha }} labels: | org.opencontainers.image.title=OGame Vue Ts org.opencontainers.image.description=OGame Vue TypeScript Implementation + org.opencontainers.image.version=${{ steps.version.outputs.version }} org.opencontainers.image.source=${{ github.server_url }}/${{ github.repository }} org.opencontainers.image.revision=${{ github.sha }} org.opencontainers.image.created=${{ steps.date.outputs.date }} diff --git a/Dockerfile.ci b/Dockerfile.ci index 46d94a4..844b07b 100644 --- a/Dockerfile.ci +++ b/Dockerfile.ci @@ -3,6 +3,16 @@ FROM nginx:alpine +# 添加构建参数用于缓存破坏 +ARG BUILD_DATE +ARG VERSION +ARG COMMIT_SHA + +# 添加标签信息 +LABEL build.date="${BUILD_DATE}" \ + build.version="${VERSION}" \ + build.commit="${COMMIT_SHA}" + # 复制 nginx 配置文件 COPY nginx.conf /etc/nginx/conf.d/default.conf @@ -11,7 +21,12 @@ RUN rm -rf /usr/share/nginx/html/* # 复制构建产物到 nginx 静态文件目录 # 这里的 docs 目录是在 GitHub Actions 中构建生成的 -COPY docs /usr/share/nginx/html +# 使用 --chown 确保正确的文件权限 +COPY --chown=nginx:nginx docs /usr/share/nginx/html + +# 验证构建产物 +RUN ls -la /usr/share/nginx/html/ && \ + test -f /usr/share/nginx/html/index.html || (echo "构建产物验证失败" && exit 1) # 暴露端口 EXPOSE 80