diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 554bb80b..792598fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -226,6 +226,29 @@ jobs: needs: [go, race, cross, gui, csrc, docs] if: github.ref == 'refs/heads/main' && github.event_name == 'push' timeout-minutes: 10 + env: + # ══════════════════════════════════════════════════════════════════ + # ★★ gitcode 镜像目标仓名 —— **本 job 的唯一定义处**。 + # 改 gitcode 仓名时只改这一行;下面推 main 的消费点走 ${GC_REPO}。 + # 与 release.yml 的 sync-gitcode 保持同值(两处各自独立定义, + # 因为它们是不同的 workflow —— 改的时候两个文件都要改,但每个 + # 文件内部只有一个定义处)。 + # + # 取值依据(实测 2026-10-21,curl 直连,非推测): + # https://gitcode.com/JianFeeeee/HomeAgent → 200 ← 当前用这个 + # https://gitcode.com/JianFeeeee/HologramAgent → 404 + # + # 背景:GitHub 主仓已改名 HologramAgent,gitcode 侧镜像仓未改名。 + # + # ⚠ 失败面(与 release.yml 不同,别搞混): + # 本 job 的 needs 是 [go, race, cross, gui, csrc, docs]。前置检查 + # exit 1 ⇒ 本 job 红 ⇒ **main 的整条 CI 红**(不是只红一格)。 + # 而 release.yml 的 sync-gitcode 只红在镜像同步这一格,GitHub 侧 + # release 产物已经发出去了。 + # + # 何时改回 HologramAgent:gitcode 上仓真正存在且返回 200 后,只改这一行。 + # ══════════════════════════════════════════════════════════════════ + GC_REPO: JianFeeeee/HomeAgent steps: - id: tok name: 检查 gitcode 凭据 @@ -253,7 +276,7 @@ jobs: run: | set -euo pipefail GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" - GC_REPO="JianFeeeee/HologramAgent" + # GC_REPO 来自 job 级 env(唯一定义处),此处不重复字面量。 # 用 ls-remote 探测:与后面那次 push 走同一个 URL、同一套凭据, # 比另调一次 API 更贴近真实失败面。 if out=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads \ @@ -295,6 +318,7 @@ jobs: run: | set -euo pipefail GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" - git push "${GC_URL}/JianFeeeee/HologramAgent.git" \ + # GC_REPO 来自 job 级 env(唯一定义处),此处不重复字面量。 + git push "${GC_URL}/${GC_REPO}.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 9652ccbb..b083db55 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -352,6 +352,27 @@ jobs: if: needs.prepare.outputs.exists == 'false' runs-on: ubuntu-latest timeout-minutes: 60 + env: + # ══════════════════════════════════════════════════════════════════ + # ★★ gitcode 镜像目标仓名 —— **本 job 的唯一定义处**。 + # 改 gitcode 仓名时只改这一行;下面所有消费点都走 ${GC_REPO}。 + # + # 取值依据(实测 2026-10-21,curl 直连,非推测): + # https://gitcode.com/JianFeeeee/HomeAgent → 200 ← 当前用这个 + # https://gitcode.com/JianFeeeee/HologramAgent → 404 + # https://gitcode.com/JianFeeeee/homeagent-sdk → 200 + # https://gitcode.com/JianFeeeee/hologramagentsdk → 200 + # https://gitcode.com/JianFeeeee/homeagentsdk → 404 + # + # 背景:GitHub 主仓已由 HomeAgent 改名为 HologramAgent,但 **gitcode 侧 + # 的镜像仓没有跟着改名**,gitcode 上 HologramAgent 仍是 404。因此这里 + # 必须指向仍然存在的 HomeAgent,否则每次发版都会红在镜像同步这一格。 + # + # 何时改回 HologramAgent:在 gitcode 上把镜像仓真正改名/新建成功、 + # 且 https://gitcode.com/JianFeeeee/HologramAgent 返回 200 之后, + # **只改这一行**即可,无需再动其他文件。 + # ══════════════════════════════════════════════════════════════════ + GC_REPO: JianFeeeee/HomeAgent steps: - uses: actions/checkout@v7 - id: tok @@ -379,7 +400,7 @@ jobs: run: | set -euo pipefail GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" - GC_REPO="JianFeeeee/HologramAgent" + # GC_REPO 来自 job 级 env(唯一定义处),此处不重复字面量。 if out=$(GIT_TERMINAL_PROMPT=0 git ls-remote --heads \ "${GC_URL}/${GC_REPO}.git" 2>&1); then echo " 目标仓可访问:gitcode.com/${GC_REPO}" @@ -419,7 +440,7 @@ jobs: TAG: ${{ needs.prepare.outputs.tag }} run: | set -euo pipefail - GC_REPO="JianFeeeee/HologramAgent" + # GC_REPO 来自 job 级 env(唯一定义处),此处不重复字面量。 GC_URL="https://JianFeeeee:${GC_TOKEN}@gitcode.com" # 1) 推 tag(附件上传前 release 条目必须先存在) git config user.name "github-actions[bot]" @@ -439,5 +460,5 @@ jobs: # 不传文件名时它扫描 ASSET_DIR 并按后缀识别发布产物 —— 这里正合适 # (.deb/.tar.gz/SHA256SUMS 都在白名单里)。 # 不要传 "./x" 或 "dist/x":那会拼成 dist/dist/x。 - ASSET_DIR=. GITCODE_REPO=JianFeeeee/HologramAgent \ + ASSET_DIR=. GITCODE_REPO="${GC_REPO}" \ python3 ../deploy/scripts/upload_assets.py "$TAG" "$GC_TOKEN" diff --git a/deploy/scripts/upload_assets.py b/deploy/scripts/upload_assets.py index c5896830..163e1f13 100755 --- a/deploy/scripts/upload_assets.py +++ b/deploy/scripts/upload_assets.py @@ -5,7 +5,13 @@ 不传 file 时上传 dist/release/ 下全部发布产物。 环境变量: - GITCODE_REPO 目标仓库,默认 JianFeeeee/HologramAgent(SDK 仓传 JianFeeeee/homeagent-sdk) + GITCODE_REPO 目标仓库,默认 JianFeeeee/HomeAgent(SDK 仓传 JianFeeeee/homeagent-sdk) + 这是 gitcode 镜像仓名的**唯一定义处**(workflow 里通过 job 级 + env.GC_REPO 传入同一个值)。改 gitcode 仓名时改这里 + 两个 + workflow 的 GC_REPO,共三处(每个文件各一个定义点)。 + 取值依据(实测 2026-10-21):gitcode 上 JianFeeeee/HomeAgent + 返回 200,JianFeeeee/HologramAgent 返回 404 —— GitHub 主仓 + 已改名 HologramAgent,但 gitcode 侧镜像仓未跟着改。 ASSET_DIR 资产目录,默认 /dist/release 为何两步:gitcode 的 release 附件不走 API 直传,而是先向 @@ -20,7 +26,7 @@ import urllib.error import urllib.parse import urllib.request -REPO = os.environ.get("GITCODE_REPO", "JianFeeeee/HologramAgent") +REPO = os.environ.get("GITCODE_REPO", "JianFeeeee/HomeAgent") API = "https://gitcode.com/api/v5/repos" # 发布产物后缀。注意 Windows 安装器是 HomeAgent_v*_win64.exe, diff --git a/docs/zh/ci-cd-runbook.md b/docs/zh/ci-cd-runbook.md index d019172a..c7f629c0 100644 --- a/docs/zh/ci-cd-runbook.md +++ b/docs/zh/ci-cd-runbook.md @@ -10,7 +10,7 @@ | --- | --- | --- | --- | | 主仓 HologramAgent | `github.com/JianFeeeee/HologramAgent`(公开) | `ci.yml` + `release.yml` | push / PR、`release/**` push | | SDK 仓 homeagentsdk | `github.com/JianFeeeee/homeagentsdk`(公开) | `release.yml` | `release/**` push | -| gitcode 镜像 | 同名仓库 | 无(由主仓 Release 的 sync job 同步) | — | +| gitcode 镜像 | `gitcode.com/JianFeeeee/HomeAgent`(**不与主仓同名**) | 无(由主仓 Release 的 sync job 同步) | — | **分支保护**(main,公开仓免费):10 项必须检查(Go build/vet/test、Race、 cross×5、GUI、C gates、Docs)+ `strict`(必须与 main 同步)+ 禁 force push。 @@ -19,6 +19,34 @@ cross×5、GUI、C gates、Docs)+ `strict`(必须与 main 同步)+ 禁 for **gitcode 的角色**:只读镜像(git push 同步)。Release 附件由 sync job 自动 补传,或手工跑 `deploy/scripts/upload_assets.py`(见 §3.4)。 +**gitcode 仓名的单点化**(2026-10-21 加):gitcode 镜像目标仓名曾在多处写死, +改名时要遍改且易漏(漏一处就是一个小死链)。现在收继到**每文件一个定义处**, +消费点全部走变量: + +| 定义处 | 形式 | 消费点 | +| --- | --- | --- | +| `.github/workflows/release.yml` | `env.GC_REPO`(job 级) | `${GC_REPO}` ×4 | +| `.github/workflows/ci.yml` | `env.GC_REPO`(job 级) | `${GC_REPO}` ×2 | +| `deploy/scripts/upload_assets.py` | `GITCODE_REPO` 环境变量默认值 | 脚本自身 | + +两个 workflow 是独立 workflow,因此各自一个定义(不能跨文件共享 env)。 +**gitcode 侧真正把仓改名成 HologramAgent 之后,只改这三个定义点即可**。 + +**当前取值 `JianFeeeee/HomeAgent`**,而不是 `HologramAgent`。实测(2026-10-21, +curl 直连):`gitcode.com/JianFeeeee/HomeAgent` → **200**, +`gitcode.com/JianFeeeee/HologramAgent` → **404**。GitHub 主仓已改名, +gitcode 侧镜像仓没跟着改。指向 HologramAgent 会让每次发版都红在镜像同步。 + +**失败面(两个 job 不一样,别搞混)**: + +- `release.yml` 的 `sync-gitcode`:`needs: [prepare, publish]`。前置检查 `exit 1` + ⇒ **只红镜像同步这一格**;GitHub 侧 release 产物已经发出去了。 +- `ci.yml` 的 `sync-gitcode-main`:`needs` 全绿(go/race/cross/gui/csrc/docs)后才跑。 + 前置检查 `exit 1` ⇒ 该 job 红 ⇒ **main 的整条 CI 红**。 + +所以仓名写错的实际后果是「每次 release/main CI 必红一格 + 国内镜像不更新」, +**不是**「发不出包」。 + ## 1. CI(ci.yml)—— 每次推送到 main / release/** / PR 都跑 六个 job,**全部命令均本地实测过**(原则:不写"应该有用"的未验证步骤): @@ -181,8 +209,11 @@ gh secret list --repo JianFeeeee/HologramAgent | grep GITCODE_TOKEN # ② token 有效 curl -s "https://gitcode.com/api/v5/user?access_token=$TOKEN" # ③ job 用的 private-token 头可读 release(两仓都测) +# ⚠ gitcode 侧主仓镜像名是 HomeAgent(不是 HologramAgent)—— +# 实测 2026-10-21:/repos/JianFeeeee/HomeAgent→400(带 token 可读)、 +# /repos/JianFeeeee/HologramAgent→404。写成 HologramAgent 是死链。 curl -s -H "private-token: $TOKEN" \ - "https://gitcode.com/api/v5/repos/JianFeeeee/HologramAgent/releases/tags/v1.3.13" + "https://gitcode.com/api/v5/repos/JianFeeeee/HomeAgent/releases/tags/v1.3.13" ``` ★ **token 是宽范围的个人令牌**(可读 92 仓/48 私有、有写权限),而 CI 只需要这两个仓。 @@ -193,7 +224,8 @@ curl -s -H "private-token: $TOKEN" \ ```bash # token 放 ~/.git-credentials(https://JianFeeeee:@gitcode.com) -ASSET_DIR=<产物目录> GITCODE_REPO=JianFeeeee/HologramAgent \ +# GITCODE_REPO 是 gitcode 镜像仓名(当前 HomeAgent),与 GitHub 侧仓名无关。 +ASSET_DIR=<产物目录> GITCODE_REPO=JianFeeeee/HomeAgent \ python3 deploy/scripts/upload_assets.py # release 条目必须先存在(脚本向 releases//upload_url 取 OBS 签名 URL) ```