From 8f974c04e040e780071eb3c1d0e3ef3c5f821729 Mon Sep 17 00:00:00 2001 From: SpecialX <47072643+wangxiner55@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:38:07 +0800 Subject: [PATCH] refactor-ci-standalone --- .gitea/workflows/ci.yml | 133 ++++++---------------------------------- 1 file changed, 18 insertions(+), 115 deletions(-) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 3071e5c..22f72dd 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -10,9 +10,10 @@ on: jobs: - build-and-test: + build-deploy: runs-on: CDCD - container: dockerreg.eazygame.cn/node:22-bookworm + # 合并 Job:统一使用带 Docker 的 Node 镜像 + container: dockerreg.eazygame.cn/node-with-docker:22 env: SKIP_ENV_VALIDATION: "1" NEXT_TELEMETRY_DISABLED: "1" @@ -31,13 +32,9 @@ jobs: restore-keys: | ${{ runner.os }}-node- + # 【保留增强】配置代理,确保 npm install 能通 - name: Configure npm proxy run: | - # 自动获取容器的默认网关 IP(即宿主机 IP) - # ip route show default | awk '{print $3}' - # 或者如果没有 ip 命令,尝试解析 host.docker.internal (如果 runner 支持) - # 这里假设容器内有 iproute2 工具 - GATEWAY_IP=$(ip route show | grep default | awk '{print $3}') echo "Detected Docker Gateway: $GATEWAY_IP" @@ -53,28 +50,15 @@ jobs: npm config set proxy "$PROXY_URL" npm config set https-proxy "$PROXY_URL" - # 设置环境变量供后续步骤使用 (例如 cypress, next build 等) + # 设置环境变量供后续步骤使用 echo "http_proxy=$PROXY_URL" >> $GITHUB_ENV echo "https_proxy=$PROXY_URL" >> $GITHUB_ENV echo "HTTP_PROXY=$PROXY_URL" >> $GITHUB_ENV echo "HTTPS_PROXY=$PROXY_URL" >> $GITHUB_ENV - - name: Show proxy status - run: | - if [ -n "$HTTP_PROXY" ] || [ -n "$http_proxy" ] || [ -n "$HTTPS_PROXY" ] || [ -n "$https_proxy" ]; then echo "proxy=on"; else echo "proxy=off"; fi - - name: Install dependencies run: npm ci - - name: Dump npm logs - if: failure() - run: | - ls -la /root/.npm/_logs || true - for f in /root/.npm/_logs/*-debug-*.log; do - echo "===== $f =====" - cat "$f" || true - done - - name: Lint run: npm run lint @@ -95,25 +79,6 @@ jobs: - name: Build run: npm run build - - # - name: 🔍 Debug - List Build Files - # run: | - # echo "=======================" - # echo "1. Root directory files:" - # ls -la - # - # echo "=======================" - # echo "2. Checking .next directory:" - # if [ -d ".next" ]; then - # ls -la .next - # else - # echo "❌ Error: .next folder does not exist!" - # fi - - # echo "=======================" - # echo "3. Deep check of .next (excluding node_modules):" - # # 查找 .next 目录下 4 层深度的文件,但排除 node_modules 避免日志太长 - # find .next -maxdepth 4 -not -path '*/node_modules*' - name: Prepare standalone build run: | @@ -124,85 +89,22 @@ jobs: cp -r .next/static/* .next/standalone/.next/static/ cp Dockerfile .next/standalone/Dockerfile - # - name: 🔍 Debug - List Build Files - # run: | - # echo "=======================" - # ls -la .next/standalone - - - name: Upload production build artifact - uses: actions/upload-artifact@v3 - with: - name: next-build - path: .next/standalone - include-hidden-files: true - - deploy: - needs: build-and-test - runs-on: CDCD - container: - image: dockerreg.eazygame.cn/node-with-docker:22 - steps: - # - name: 🌐 Setup Network (Dynamic) - # run: | - # # 1. 动态获取 Docker 网关 IP - # # 尝试多种方式获取网关 IP - - # GATEWAY_IP="" - - # # 尝试使用 ip route (如果可用) - # if command -v ip >/dev/null 2>&1; then - # GATEWAY_IP=$(ip route show | grep default | awk '{print $3}') - # fi - - # # 如果 ip 命令不可用,尝试 hostname -I 推断 - # if [ -z "$GATEWAY_IP" ]; then - # CURRENT_IP=$(hostname -I 2>/dev/null | awk '{print $1}') - # if [ -n "$CURRENT_IP" ]; then - # GATEWAY_IP=$(echo "$CURRENT_IP" | sed 's/\.[0-9]*$/.1/') - # fi - # fi - - # # 兜底 - # if [ -z "$GATEWAY_IP" ]; then - # echo "Warning: Could not detect gateway IP, using fallback 172.17.0.1" - # GATEWAY_IP="172.17.0.1" - # fi - - # echo "Detected Docker Gateway: $GATEWAY_IP" - - # # 2. 配置 Host 解析 (解决 gittea.eazygame.cn 无法访问的问题) - # # 注意:需要容器内有 root 权限 - # if [ "$(id -u)" -eq 0 ]; then - # echo "$GATEWAY_IP gittea.eazygame.cn" >> /etc/hosts - # cat /etc/hosts - # else - # echo "Warning: Not root, cannot modify /etc/hosts" - # fi - - # # 3. 设置 NO_PROXY (非常重要!防止请求走代理导致 Timeout) - # # 包含 localhost, 127.0.0.1, 网关IP, 以及 Gitea 域名 - # NO_PROXY_VAL="localhost,127.0.0.1,$GATEWAY_IP,gittea.eazygame.cn,.eazygame.cn,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12" - # echo "NO_PROXY=$NO_PROXY_VAL" >> $GITHUB_ENV - # echo "no_proxy=$NO_PROXY_VAL" >> $GITHUB_ENV - - - name: Download artifacts - uses: actions/download-artifact@v3 - with: - name: next-build - + # 【核心变更】合并 Deploy 步骤,直接构建镜像,无需 artifact - name: Deploy to Docker run: | - # 1. 使用 --no-cache 防止使用旧的构建层,确保部署的是最新代码 - # 2. 使用 --pull 确保基础镜像是最新的 - docker build --no-cache --pull -t nextjs-app . + # 1. 进入 standalone 目录 + cd .next/standalone - # 3. 优雅停止:先尝试 stop,如果失败则无需处理 (|| true) + # 2. 构建镜像 (使用 standalone 目录下的 Dockerfile) + echo "Building Docker image from standalone..." + docker build --no-cache --pull -t nextjs-app . + + # 3. 优雅停止 docker stop nextjs-app || true docker rm nextjs-app || true - - # 4. 运行容器: - # --init: 解决 Node.js PID 1 僵尸进程问题 - # --restart unless-stopped: 自动重启策略 + + # 4. 运行容器 + # 使用你后来补充的完整配置 (包含 network 和 NEXTAUTH) docker run -d \ --init \ -p 8015:3000 \ @@ -215,4 +117,5 @@ jobs: -e NEXTAUTH_URL=${{ secrets.NEXTAUTH_URL }} \ -e NEXT_TELEMETRY_DISABLED=1 \ nextjs-app - + + echo "Deploy complete!"