From f5b7bef2854e5ca601abc835b78e0cfd018c8ba4 Mon Sep 17 00:00:00 2001 From: HenryDu8133 <813367384@qq.com> Date: Sun, 13 Sep 2026 00:21:09 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20Preflight=20npm=20ci=20=E9=98=B2?= =?UTF-8?q?=E8=B6=85=E6=97=B6=20+=20Deploy=20job=20=E8=AF=AF=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E4=BF=9D=E6=8A=A4\n\n-=20deploy.yml=20preflight/?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E4=BE=9D=E8=B5=96=20Step=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=8C=E5=8F=8C=20registry=20=E5=88=87=E6=8D=A2=20+?= =?UTF-8?q?=203=20=E8=BD=AE=E9=87=8D=E8=AF=95=20+=20npm=20fetch-retries=3D?= =?UTF-8?q?5=20+=20fetch-timeout=3D5min=20+=20prefer-offline=E3=80=8D\n=20?= =?UTF-8?q?=20-=20=E4=B8=BB=E7=AB=99=20https://registry.npmmirror.com=20?= =?UTF-8?q?=E5=A4=87=E7=94=A8=20https://mirrors.cloud.tencent.com/npm/?= =?UTF-8?q?=EF=BC=88=E4=B8=A4=E5=A5=97=E7=8B=AC=E7=AB=8B=20CDN=20=E8=8A=82?= =?UTF-8?q?=E7=82=B9=EF=BC=89=EF=BC=8C=E5=A5=87=E5=81=B6=E6=AC=A1=E4=BA=A4?= =?UTF-8?q?=E6=9B=BF\n=20=20-=20npm=20=E5=86=85=E9=83=A8=20read=20ETIMEDOU?= =?UTF-8?q?T=EF=BC=88exit=20146=EF=BC=89=E8=87=AA=E5=8A=A8=E8=B5=B0=20fetc?= =?UTF-8?q?h-retries=20=E9=87=8D=E8=AF=95=EF=BC=9B=E6=95=B4=E8=BD=AE?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=20bash=20=E5=B1=82=2015s=20=E5=90=8E?= =?UTF-8?q?=E5=86=8D=E8=B7=91=E4=B8=8B=E4=B8=80=E8=BD=AE\n=20=20-=20?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=203=20=E8=BD=AE=E6=89=8D=E7=9C=9F=E6=AD=A3?= =?UTF-8?q?=20exit=201=EF=BC=8C=E5=B9=B6=E5=9C=A8=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E4=B8=AD=E6=98=8E=E7=A1=AE=E6=8F=90=E7=A4=BA=E5=8F=AF=E8=A6=86?= =?UTF-8?q?=E7=9B=96=20NPM=5FREGISTRY=5FPRIMARY/FALLBACK\n-=20deploy.yml?= =?UTF-8?q?=20deploy=20job=EF=BC=9Aif=20=E6=9D=A1=E4=BB=B6=E4=BB=8E=20\x27?= =?UTF-8?q?!cancelled()=20&&=20!failure()\x27=20=E6=94=B9=E4=B8=BA=20\x27a?= =?UTF-8?q?lways()=20&&=20needs.build-image.result=20=3D=3D=20\x27\x27succ?= =?UTF-8?q?ess\x27\x27\x27\n=20=20-=20=E4=B9=8B=E5=89=8D=20build-image=20?= =?UTF-8?q?=E8=A2=AB=20skip=EF=BC=88preflight=20=E5=85=88=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=EF=BC=89=E6=97=B6=EF=BC=8C!failure()=20=E4=B8=BA?= =?UTF-8?q?=E7=9C=9F=E5=AF=BC=E8=87=B4=20deploy=20=E8=A2=AB=E8=A7=A6?= =?UTF-8?q?=E5=8F=91=E4=BD=86=20IMAGE=5FNEW=20=E7=A9=BA=20=E2=86=92=20exit?= =?UTF-8?q?=209=20=E8=AF=AF=E6=8A=A5=E4=B8=BA=20deploy=20=E6=9C=AC?= =?UTF-8?q?=E8=BA=AB=E9=94=99\n=20=20-=20=E7=8E=B0=E5=9C=A8=E4=BB=85?= =?UTF-8?q?=E5=BD=93=20build-image=20=E7=9C=9F=E7=9A=84=20success=20?= =?UTF-8?q?=E6=97=B6=E6=89=8D=E4=BC=9A=E6=89=A7=E8=A1=8C=20deploy=EF=BC=8C?= =?UTF-8?q?build-image=20=E8=A2=AB=E8=B7=B3=E8=BF=87/=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E6=97=B6=20deploy=20=E8=87=AA=E5=8A=A8=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=B8=BA=20skipped=EF=BC=88=E7=AC=A6=E5=90=88=E8=AF=AD?= =?UTF-8?q?=E4=B9=89=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/deploy.yml | 48 +++++++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 327ef30..60e5d4d 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -178,13 +178,47 @@ jobs: git clone --depth 1 -b "${BRANCH}" "${REPO_URL}" . git rev-parse --short HEAD - - name: 安装依赖(npm ci) + - name: 安装依赖(npm ci,含网络超时兜底:双 registry 切换 + 3 次重试 + fetch-retires 5 次 + 5 分钟 fetch-timeout) run: | - set -euxo pipefail - npm config set registry https://registry.npmmirror.com || true - npm config set fund false - npm config set audit false - npm ci --legacy-peer-deps + set -euo pipefail + # npmmirror 双域名容错(主站 registry.npmmirror.com + 腾讯云镜像 mirrors.cloud.tencent.com/npm/,两套独立 CDN 节点) + NPM_REGISTRY_PRIMARY="${NPM_REGISTRY_PRIMARY:-https://registry.npmmirror.com}" + NPM_REGISTRY_FALLBACK="${NPM_REGISTRY_FALLBACK:-https://mirrors.cloud.tencent.com/npm/}" + MAX_RETRY=3 + DELAY_SEC=15 + CI_OK=0 + for ATTEMPT in $(seq 1 $MAX_RETRY); do + # 奇数次用主站、偶数次切备用域名(npmmirror 主站 429/超时/断流时兜底,避免一直卡一个节点) + if [ $(( ATTEMPT % 2 )) -eq 1 ]; then + CUR_REGISTRY="${NPM_REGISTRY_PRIMARY}" + else + CUR_REGISTRY="${NPM_REGISTRY_FALLBACK}" + fi + echo "--- [npm ci attempt $ATTEMPT/$MAX_RETRY] registry=${CUR_REGISTRY} ---" + npm config set registry "${CUR_REGISTRY}" || true + npm config set fund false + npm config set audit false + npm config set prefer-offline true 2>/dev/null || true + npm config set cache-min 3600 2>/dev/null || true + # fetch-retries: npm 内部单次请求失败重试(read ETIMEDOUT / ECONNRESET 等网络抖动) + npm config set fetch-retries 5 2>/dev/null || true + # fetch-timeout=300000ms(5 分钟):esbuild/@swc 等大型原生 prebuilt 包慢链路时避免 30s 读超时 + npm config set fetch-retry-maxtimeout 300000 2>/dev/null || true + npm config set fetch-timeout 300000 2>/dev/null || true + npm config set fetch-retry-mintimeout 20000 2>/dev/null || true + if npm ci --legacy-peer-deps; then + CI_OK=1 + echo "[npm ci] attempt ${ATTEMPT} SUCCESS" + break + fi + echo "[npm ci] attempt ${ATTEMPT} FAILED(exit=$?),${DELAY_SEC}s 后重试下一轮(若还有)..." + sleep $DELAY_SEC + done + if [ "${CI_OK}" != "1" ]; then + echo "ERROR: npm ci 经过 ${MAX_RETRY} 轮(主站/备用域名交替)仍失败,请检查 Runner 网络是否能访问 ${NPM_REGISTRY_PRIMARY} / ${NPM_REGISTRY_FALLBACK}" >&2 + echo " 可在 Variables 中覆盖 NPM_REGISTRY_PRIMARY / NPM_REGISTRY_FALLBACK,或在 Runner 宿主机手动配 npm 代理" >&2 + exit 1 + fi - name: 检查 package.json 无 pnpm 残留 run: | @@ -497,7 +531,7 @@ jobs: deploy: name: 部署到生产服务器 needs: build-image - if: ${{ !cancelled() && !failure() && (github.event_name == 'push' || inputs.deploy_target == true) }} + if: always() && needs.build-image.result == 'success' && (github.event_name == 'push' || inputs.deploy_target == true) runs-on: ubuntu-latest timeout-minutes: 25 environment: