From a7331251abfe59f3acfd1c6168fb8e57c46b37a2 Mon Sep 17 00:00:00 2001 From: commondev Date: Wed, 21 Oct 2026 18:10:55 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ci):=20=E6=89=B94b=20=E6=B8=85?= =?UTF-8?q?=E7=90=86=20CI/=E9=95=9C=E5=83=8F=E9=93=BE=E8=B7=AF=E6=97=A7?= =?UTF-8?q?=E4=BB=93=E5=90=8D=EF=BC=8C=E5=B9=B6=E5=8A=A0=20gitcode=20?= =?UTF-8?q?=E7=9B=AE=E6=A0=87=E4=BB=93=E5=89=8D=E7=BD=AE=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 改名 HomeAgent → HologramAgent 后,CI 里仍写死旧仓库路径,且镜像链路 一旦目标仓缺失只会得到 git 的原始报错,看不出「仓没建」。 改动: - ci.yml: sync-gitcode-main 推 main 目标改为 JianFeeeee/HologramAgent, 并在 push 前新增「前置检查 gitcode 目标仓是否存在」独立 step。 - release.yml: sync-gitcode 的 push / releases API / GITCODE_REPO 统一 走 GC_REPO=JianFeeeee/HologramAgent 变量;同样新增前置检查 step。 前置检查语义: - GITCODE_TOKEN 未配置 → 沿用既有「跳过镜像同步」(可选项,不算错误); - token 有但目标仓不存在 → 打印要建的仓与地址,exit 1 硬失败; - 探测与 push 用同一 URL、同一凭据(git ls-remote),贴近真实失败面; - 日志对 URL userinfo 做结构脱敏,避免 token 被 git 报错带出。 gitcode 报错文本按 2026-10 实测校准:目标仓不存在时返回 remote: The project you were looking for could not be found. fatal: ... The requested URL returned error: 403 是 "could not be found" + 403,不是 GitHub 那种 404 / Repository not found, 故分类同时匹配这两种形态(401/403 单列一支,提示仓未建或 token 无权限)。 未执行任何线上动作:不重命名 GitHub 仓、不建 gitcode 镜像仓、不 push/开 PR/打 tag。 --- .github/workflows/ci.yml | 49 +++++++++++++++++++++++++++++++- .github/workflows/release.yml | 53 ++++++++++++++++++++++++++++++++--- 2 files changed, 97 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index df1f30e1..554bb80b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -241,6 +241,53 @@ jobs: with: # 必须取完整历史:镜像可能在任意旧提交上,快进需要共同祖先。 fetch-depth: 0 + # ★ 改名(HomeAgent → HologramAgent)后的必然过渡态:gitcode 上的镜像仓 + # 是**另一个账号下的独立仓库**,改 GitHub 仓名不会自动建出它。 + # 若不在这里显式探测,缺少目标仓时只会得到 git 的原始报错 + # ("repository not found" 混在 push 输出里),看不出是「仓没建」。 + # 语义:token 未配置 = 可选项跳过(上面那步);token 有但仓不存在 = 硬失败。 + - name: 前置检查 gitcode 目标仓是否存在 + if: steps.tok.outputs.ok == 'true' + env: + GC_TOKEN: ${{ secrets.GITCODE_TOKEN }} + run: | + set -euo pipefail + GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" + GC_REPO="JianFeeeee/HologramAgent" + # 用 ls-remote 探测:与后面那次 push 走同一个 URL、同一套凭据, + # 比另调一次 API 更贴近真实失败面。 + if out=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads \ + "${GC_URL}/${GC_REPO}.git" 2>&1); then + echo " 目标仓可访问:gitcode.com/${GC_REPO}" + else + # 日志脱敏:git 报错可能把 URL 的 userinfo(token 就在里面)带出来。 + # 先按 URL 结构遮 https://@ —— 与 token 内容无关,稳; + # 再尽力遮一次字面量(token 含特殊字符时可能不生效,故只做兜底)。 + err=$(printf '%s\n' "$out" | sed -E 's#(https?://)[^@/[:space:]]*@#\1***@#g') + err=$(printf '%s\n' "$err" | sed "s|${GC_TOKEN}|***|g" 2>/dev/null || printf '%s\n' "$err") + case "$err" in + # gitcode 真实报错(2026-10 实测):目标仓不存在时返回 + # remote: The project you were looking for could not be found. + # fatal: ... The requested URL returned error: 403 + # 注意是 "could not be found" 与 403,不是 github 那种 "Repository not found"/404。 + *"could not be found"*|*"not found"*|*"Not Found"*|*"404"*|*"does not exist"*|*"does not appear to be a git repository"*) + echo " ✗ gitcode 目标仓不存在:gitcode.com/${GC_REPO}" + echo " 请先在该账号下创建镜像仓(只读镜像),再重跑本 job:" + echo " https://gitcode.com/${GC_REPO}" + ;; + *"403"*|*"401"*|*"Forbidden"*|*"Unauthorized"*) + echo " ✗ 无法访问 gitcode 目标仓 gitcode.com/${GC_REPO}:仓不存在,或 token 无权访问" + echo " 若仓已建,请确认 GITCODE_TOKEN 属于该仓的推送账号:" + echo " https://gitcode.com/${GC_REPO}" + ;; + *) + echo " ✗ 无法访问 gitcode 目标仓 gitcode.com/${GC_REPO}(网络或凭据问题):" + printf '%s\n' "$err" | sed 's/^/ /' + ;; + esac + # 显式失败 —— 不静默跳过,也不 echo 一句就当成功。 + exit 1 + fi - name: 推 main 到 gitcode(快进) if: steps.tok.outputs.ok == 'true' env: @@ -248,6 +295,6 @@ jobs: run: | set -euo pipefail GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" - git push "${GC_URL}/JianFeeeee/HomeAgent.git" \ + git push "${GC_URL}/JianFeeeee/HologramAgent.git" \ "refs/heads/main:refs/heads/main" echo " gitcode/main 已快进到 ${GITHUB_SHA}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dc40a6e2..9652ccbb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -368,6 +368,50 @@ jobs: with: name: linux-amd64 path: dist + # ★ 前置检查:gitcode 镜像仓是否存在。 + # 改名(HomeAgent → HologramAgent)后 gitcode 目标仓需要**人工新建**, + # 不探的话失败会埋在 push/curl 的原始输出里,看不出是「仓没建」。 + # 语义:token 未配 = 可选项跳过(上一步);token 有但仓不存在 = 硬失败。 + - name: 前置检查 gitcode 目标仓是否存在 + if: steps.tok.outputs.ok == 'true' + env: + GC_TOKEN: ${{ secrets.GITCODE_TOKEN }} + run: | + set -euo pipefail + GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" + GC_REPO="JianFeeeee/HologramAgent" + if out=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads \ + "${GC_URL}/${GC_REPO}.git" 2>&1); then + echo " 目标仓可访问:gitcode.com/${GC_REPO}" + else + # 日志脱敏:git 报错可能把 URL 的 userinfo(token 就在里面)带出来。 + # 先按 URL 结构遮 https://@ —— 与 token 内容无关,稳; + # 再尽力遮一次字面量(token 含特殊字符时可能不生效,故只做兜底)。 + err=$(printf '%s\n' "$out" | sed -E 's#(https?://)[^@/[:space:]]*@#\1***@#g') + err=$(printf '%s\n' "$err" | sed "s|${GC_TOKEN}|***|g" 2>/dev/null || printf '%s\n' "$err") + case "$err" in + # gitcode 真实报错(2026-10 实测):目标仓不存在时返回 + # remote: The project you were looking for could not be found. + # fatal: ... The requested URL returned error: 403 + # 注意是 "could not be found" 与 403,不是 github 那种 "Repository not found"/404。 + *"could not be found"*|*"not found"*|*"Not Found"*|*"404"*|*"does not exist"*|*"does not appear to be a git repository"*) + echo " ✗ gitcode 目标仓不存在:gitcode.com/${GC_REPO}" + echo " 请先在该账号下创建镜像仓(只读镜像),再重跑本 job:" + echo " https://gitcode.com/${GC_REPO}" + ;; + *"403"*|*"401"*|*"Forbidden"*|*"Unauthorized"*) + echo " ✗ 无法访问 gitcode 目标仓 gitcode.com/${GC_REPO}:仓不存在,或 token 无权访问" + echo " 若仓已建,请确认 GITCODE_TOKEN 属于该仓的推送账号:" + echo " https://gitcode.com/${GC_REPO}" + ;; + *) + echo " ✗ 无法访问 gitcode 目标仓 gitcode.com/${GC_REPO}(网络或凭据问题):" + printf '%s\n' "$err" | sed 's/^/ /' + ;; + esac + # 显式失败 —— 不静默跳过,也不 echo 一句就当成功。 + exit 1 + fi - name: 推 tag 与附件到 gitcode if: steps.tok.outputs.ok == 'true' env: @@ -375,17 +419,18 @@ jobs: TAG: ${{ needs.prepare.outputs.tag }} run: | set -euo pipefail + GC_REPO="JianFeeeee/HologramAgent" + GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" # 1) 推 tag(附件上传前 release 条目必须先存在) git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" git tag -a "$TAG" -m "$TAG" 2>/dev/null || true - GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" - git push "${GC_URL}/JianFeeeee/HomeAgent.git" "$TAG" + git push "${GC_URL}/${GC_REPO}.git" "$TAG" # 2) 建 release 条目 curl -sS --max-time 60 -X POST \ -H "private-token: ${GC_TOKEN}" \ -H "Content-Type: application/json" \ - "https://gitcode.com/api/v5/repos/JianFeeeee/HomeAgent/releases" \ + "https://gitcode.com/api/v5/repos/${GC_REPO}/releases" \ -d "{\"tag_name\":\"$TAG\",\"body\":\"同步自 GitHub\"}" \ -o /tmp/.gcrel -w " 建 release → %{http_code}\n" # 3) 上传附件(用仓库既有脚本,它处理 OBS 预签名两步流程) @@ -394,5 +439,5 @@ jobs: # 不传文件名时它扫描 ASSET_DIR 并按后缀识别发布产物 —— 这里正合适 # (.deb/.tar.gz/SHA256SUMS 都在白名单里)。 # 不要传 "./x" 或 "dist/x":那会拼成 dist/dist/x。 - ASSET_DIR=. GITCODE_REPO=JianFeeeee/HomeAgent \ + ASSET_DIR=. GITCODE_REPO=JianFeeeee/HologramAgent \ python3 ../deploy/scripts/upload_assets.py "$TAG" "$GC_TOKEN"