Files
CICD/.gitea/workflows/ci.yml
SpecialX af9df01046
Some checks failed
CI / build-and-test (push) Failing after 17s
CI / deploy (push) Has been skipped
fix-ci-dynamic-ip
2026-02-25 17:49:11 +08:00

218 lines
7.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: CI
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build-and-test:
runs-on: CDCD
container:
image: dockerreg.eazygame.cn/node:22-bookworm
# 不再硬编码 options改用动态脚本配置
env:
SKIP_ENV_VALIDATION: "1"
NEXT_TELEMETRY_DISABLED: "1"
# 代理设置将在步骤中动态生成,这里先留空或仅保留默认值
# http_proxy: ... (removed)
steps:
- name: 🌐 Setup Network & Proxy (Dynamic)
run: |
# 1. 动态获取 Docker 网关 IP (即宿主机 IP)
GATEWAY_IP=$(ip route show | grep default | awk '{print $3}')
echo "Detected Docker Gateway IP: $GATEWAY_IP"
# 2. 配置 Host 解析 (解决 gittea.eazygame.cn 无法访问的问题)
# 注意:需要容器内有 root 权限 (node 镜像默认是 root)
echo "$GATEWAY_IP gittea.eazygame.cn" >> /etc/hosts
cat /etc/hosts
# 3. 动态设置代理环境变量
PROXY_URL="http://$GATEWAY_IP:7890"
echo "Setting Proxy to: $PROXY_URL"
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
# 4. 设置 NO_PROXY (内网不走代理)
# 包含 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: Checkout
uses: actions/checkout@v3
# 1. 增加 Cache 策略,显著加快 npm ci 速度
- name: Cache npm dependencies
uses: actions/cache@v3
id: npm-cache
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Configure npm proxy
run: |
# 容器现在是 Host 模式,直接使用 localhost 即可
npm config set proxy "$HTTP_PROXY"
npm config set https-proxy "$HTTPS_PROXY"
echo "Using Proxy: $HTTP_PROXY"
- name: Debug Network
run: |
echo "Testing connection to 172.28.0.1 proxy..."
curl -v --connect-timeout 2 http://172.28.0.1:7890 || echo "Failed to connect to 172.28.0.1:7890"
echo "Testing google via proxy (172.28.0.1)..."
curl -I -x http://172.28.0.1:7890 https://www.google.com || echo "Failed to curl google via 172.28.0.1"
echo "Current IP info:"
ip addr || true
echo "Clash port status (if netstat available):"
netstat -an | grep 7890 || true
- 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
- name: Typecheck
run: npm run typecheck
# 2. 增加 Next.js 构建缓存
- name: Cache Next.js build
uses: actions/cache@v3
with:
path: |
~/.npm
${{ github.workspace }}/.next/cache
# Generate a new cache whenever packages or source files change.
key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-${{ hashFiles('**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx') }}
restore-keys: |
${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}-
- 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: |
mkdir -p .next/standalone/public
mkdir -p .next/standalone/.next/static
cp -r public/* .next/standalone/public/
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) for Deploy
run: |
# 1. 动态获取 Docker 网关 IP (即宿主机 IP)
# 注意:如果在宿主机直接运行 (没有 container),这个逻辑可能不需要,或者 IP 就是 127.0.0.1
# 但为了保险起见,我们还是探测一下
GATEWAY_IP=$(ip route show | grep default | awk '{print $3}') || echo "127.0.0.1"
echo "Detected Gateway IP: $GATEWAY_IP"
# 2. 配置 Host 解析 (如果是在容器内运行)
if [ -f /etc/hosts ] && [ "$(id -u)" -eq 0 ]; then
echo "$GATEWAY_IP gittea.eazygame.cn" >> /etc/hosts || true
cat /etc/hosts
fi
# 3. 设置 NO_PROXY 环境变量供后续步骤使用
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
- name: Deploy to Docker
run: |
# 1. 使用 --no-cache 防止使用旧的构建层,确保部署的是最新代码
# 2. 使用 --pull 确保基础镜像是最新的
docker build --no-cache --pull -t nextjs-app .
# 3. 优雅停止:先尝试 stop如果失败则无需处理 (|| true)
docker stop nextjs-app || true
docker rm nextjs-app || true
# 4. 运行容器:
# --init: 解决 Node.js PID 1 僵尸进程问题
# --restart unless-stopped: 自动重启策略
docker run -d \
--init \
-p 8015:3000 \
--restart unless-stopped \
--name nextjs-app \
--network 1panel-network \
-e NODE_ENV=production \
-e DATABASE_URL=${{ secrets.DATABASE_URL }} \
-e NEXTAUTH_SECRET=${{ secrets.NEXTAUTH_SECRET }} \
-e NEXTAUTH_URL=${{ secrets.NEXTAUTH_URL }} \
-e NEXT_TELEMETRY_DISABLED=1 \
nextjs-app