|
| 1 | +# KsADK 公开分支与发布流程 |
| 2 | + |
| 3 | +本文档定义内部 `master` 与 GitHub 公开 `main` 的长期维护方式。它是发布和公开同步的执行依据。 |
| 4 | + |
| 5 | +## 当前模型 |
| 6 | + |
| 7 | +`master` 是内部源主干,GitHub `main` 是公开发布主干。两者不应该长期维护两套功能代码或两套发布门禁。公开版本由内部 `master` 的已审核状态通过 clean export 生成,导出脚本只移除不适合公开的材料。 |
| 8 | + |
| 9 | +公开 `main` 应包含: |
| 10 | + |
| 11 | +- 公开 SDK 源码:`ksadk/`、`ksadk_runtime_common/`。 |
| 12 | +- 公开构建与发布门禁:`Makefile`、`scripts/open_source_audit.py`、`scripts/check_*`、`.github/workflows/*`。 |
| 13 | +- 公开文档站:`docs-site/`。 |
| 14 | +- 公开 README、CHANGELOG、LICENSE、CONTRIBUTING、AGENTS、CLAUDE。 |
| 15 | +- 公开发布所需的最小测试集。 |
| 16 | + |
| 17 | +内部 `master` 可以额外包含: |
| 18 | + |
| 19 | +- 内部 docs、archive、runbook、设计草稿和预览材料。 |
| 20 | +- 内部 agent skills / operator playbooks。 |
| 21 | +- 内部验证脚本、E2E、长任务和平台集成测试。 |
| 22 | +- 内部部署资产、临时缓存、zread/site/build 产物等。 |
| 23 | + |
| 24 | +因此不能简单理解为“只差 docs 和 skills 两个目录”。准确说法是:**公开导出的源码和发布门禁必须与 `master` 的公开子集一致;非公开材料由导出脚本排除**。 |
| 25 | + |
| 26 | +## 硬性规则 |
| 27 | + |
| 28 | +1. 不直接 `merge master -> main`,也不把内部 `master` 直接 push 到 GitHub。 |
| 29 | +2. 公开同步必须走 clean export candidate 或等价的公开候选分支。 |
| 30 | +3. 公开候选必须先通过 `make public-preflight`。 |
| 31 | +4. npm、PyPI、GitHub Pages 都必须由可信 GitHub workflow 发布;不使用本地 `npm publish`、本地 `twine upload` 或手工上传 Pages。 |
| 32 | +5. GitHub Release、PyPI 包、Pages 文档必须能追溯到同一个已审核 GitHub `main` 提交。 |
| 33 | +6. `.pypirc`、私有 registry 凭证、kubeconfig、真实 API key、临时 token 不得进入仓库。 |
| 34 | + |
| 35 | +## 准备 ksadk-web |
| 36 | + |
| 37 | +`ksadk-web` 是共享 UI 源头。需要新 UI 时,先在 `agentengine/ksadk-web` 发 npm 版本,再让 `ksadk-python` 和 `agentengine-hosted-ui` 消费 registry 里的固定版本。 |
| 38 | + |
| 39 | +本地只做验证: |
| 40 | + |
| 41 | +```bash |
| 42 | +cd agentengine/ksadk-web |
| 43 | +npm test |
| 44 | +node --test tests/*.test.mjs |
| 45 | +npm run build:all |
| 46 | +npm pack --dry-run --access public |
| 47 | +``` |
| 48 | + |
| 49 | +正式 npm 发布只走 GitHub workflow: |
| 50 | + |
| 51 | +- 推送 `ksadk-web` 代码到 GitHub `main`。 |
| 52 | +- 创建 GitHub Release 或手动触发 `publish-npm.yml`。 |
| 53 | +- workflow 使用 `npm publish --provenance` 发布。 |
| 54 | +- 发布后用 `npm view @kingsoftcloud/ksadk-web@<version>` 确认 registry 可见。 |
| 55 | + |
| 56 | +## 准备内部 master |
| 57 | + |
| 58 | +在 `agentengine/ksadk-python` 内部主干完成代码、文档、版本和审批记录: |
| 59 | + |
| 60 | +```bash |
| 61 | +git checkout master |
| 62 | +git status --short --branch |
| 63 | +uv run pytest <相关测试> |
| 64 | +git diff --check |
| 65 | +``` |
| 66 | + |
| 67 | +如果本次需要绑定新的 UI 版本,确认 `KSADK_WEB_VERSION` 默认值、README、docs-site、approval record 都引用同一个 npm 版本。 |
| 68 | + |
| 69 | +更新审批记录: |
| 70 | + |
| 71 | +```bash |
| 72 | +uv run python scripts/check_approval_record.py \ |
| 73 | + --expected-current-commit <reviewed-internal-master-commit> |
| 74 | +uv run pytest tests/test_check_approval_record.py tests/test_public_release_positioning.py -q |
| 75 | +``` |
| 76 | + |
| 77 | +审批记录必须写清: |
| 78 | + |
| 79 | +- reviewed internal `ksadk-python` commit。 |
| 80 | +- `ksadk-web` npm version 和 source commit。 |
| 81 | +- 已执行的 public preflight / docs build / package audit 证据。 |
| 82 | +- Maintainer、Security reviewer、Release owner sign-off。 |
| 83 | + |
| 84 | +## 生成公开候选 |
| 85 | + |
| 86 | +公开候选从内部 master clean export 生成: |
| 87 | + |
| 88 | +```bash |
| 89 | +cd agentengine/ksadk-python |
| 90 | +rm -rf /tmp/ksadk-python-export-candidate-<version> |
| 91 | +python scripts/prepare_ksadk_python_export.py \ |
| 92 | + --output-dir /tmp/ksadk-python-export-candidate-<version> \ |
| 93 | + --summary |
| 94 | +python3 scripts/open_source_audit.py \ |
| 95 | + --target public-repo \ |
| 96 | + --root /tmp/ksadk-python-export-candidate-<version> |
| 97 | +``` |
| 98 | + |
| 99 | +同步到长期 public worktree: |
| 100 | + |
| 101 | +```bash |
| 102 | +git fetch github main |
| 103 | +git worktree add .worktrees/public-main github/main # 首次需要 |
| 104 | +rsync -a --delete --exclude .git \ |
| 105 | + /tmp/ksadk-python-export-candidate-<version>/ \ |
| 106 | + .worktrees/public-main/ |
| 107 | +``` |
| 108 | + |
| 109 | +`.worktrees/public-main` 是公开候选工作区,不做日常内部开发。 |
| 110 | + |
| 111 | +## 公开候选门禁 |
| 112 | + |
| 113 | +在 public worktree 运行完整门禁: |
| 114 | + |
| 115 | +```bash |
| 116 | +cd .worktrees/public-main |
| 117 | +make public-preflight |
| 118 | +``` |
| 119 | + |
| 120 | +该门禁至少覆盖: |
| 121 | + |
| 122 | +- PyPI 版本未重复发布。 |
| 123 | +- secret 和公开路径 audit。 |
| 124 | +- 从 npm registry 同步 `@kingsoftcloud/ksadk-web` 静态资源。 |
| 125 | +- 公开测试集。 |
| 126 | +- `docs-site` Fumadocs 静态构建。 |
| 127 | +- wheel/sdist 构建。 |
| 128 | +- `twine check dist/*`。 |
| 129 | +- wheel/sdist 文件列表 audit。 |
| 130 | + |
| 131 | +失败即停止,不创建 Release,不触发 PyPI,不部署 Pages。 |
| 132 | + |
| 133 | +## 同步 GitHub main |
| 134 | + |
| 135 | +公开候选通过门禁后,通过 GitHub PR 或受保护 main 策略合入 GitHub `main`。推荐路径: |
| 136 | + |
| 137 | +1. 在 `.worktrees/public-main` 提交候选。 |
| 138 | +2. 推送到 GitHub release candidate 分支。 |
| 139 | +3. 开 PR 到 GitHub `main`。 |
| 140 | +4. 等 CI / release-check / docs-site build 通过并完成 review。 |
| 141 | +5. 合并 PR,使 GitHub `main` 成为唯一公开发布源。 |
| 142 | + |
| 143 | +如果维护者明确选择 fast-forward 或直接更新 `main`,也必须满足同样门禁和 review 条件。不要从内部 `master` 创建公开 release 资产。 |
| 144 | + |
| 145 | +## Tag 与 GitHub Release |
| 146 | + |
| 147 | +tag 必须指向 GitHub `main` 上已审核、已合入的公开提交: |
| 148 | + |
| 149 | +```bash |
| 150 | +git fetch github main |
| 151 | +git checkout .worktrees/public-main |
| 152 | +git pull --ff-only github main |
| 153 | +make public-release-tag V=<version> |
| 154 | +git push github v<version> |
| 155 | +``` |
| 156 | + |
| 157 | +创建 GitHub Release 时使用该 tag。发布说明应引用: |
| 158 | + |
| 159 | +- GitHub `main` commit。 |
| 160 | +- tag。 |
| 161 | +- `ksadk-web` npm version。 |
| 162 | +- `make public-preflight` 结果。 |
| 163 | +- PyPI/Pages workflow run。 |
| 164 | + |
| 165 | +## PyPI 与 GitHub Pages |
| 166 | + |
| 167 | +正式发布只走 `.github/workflows/publish-pypi.yml`: |
| 168 | + |
| 169 | +- 触发条件:GitHub Release `published` 或手动 `workflow_dispatch`。 |
| 170 | +- 输入:`ksadk_web_version`、`approved_source_commit` 和 `publish_target`。 |
| 171 | +- 正常发版使用 `publish_target=full`:workflow 会跑完整 `make public-preflight`,发布 `ksadk` 主包,构建并发布 `agentengine-sdk-python` 别名包,并部署 GitHub Pages。 |
| 172 | +- 补发别名包使用 `publish_target=alias-only`:workflow 只跑公开审计、公开测试、别名包构建审计和 approval gate,只发布 `agentengine-sdk-python`,不重发 `ksadk`,也不部署 GitHub Pages。 |
| 173 | +- workflow 先同步 npm registry 中的 UI 静态资源。 |
| 174 | +- workflow 再按 `publish_target` 运行对应发布前检查。 |
| 175 | +- workflow 再运行 `make public-publish-gate`,校验 approval record。 |
| 176 | +- PyPI 上传使用 OIDC Trusted Publishing。 |
| 177 | +- GitHub Pages 由同一个 workflow 构建 `docs-site` 并部署。 |
| 178 | + |
| 179 | +发布后核对: |
| 180 | + |
| 181 | +```bash |
| 182 | +python scripts/check_publication_state.py --phase post-publish --version <version> |
| 183 | +npm view @kingsoftcloud/ksadk-web@<web-version> version |
| 184 | +python - <<'PY' |
| 185 | +import json, urllib.request |
| 186 | +for name in ["ksadk", "agentengine-sdk-python"]: |
| 187 | + with urllib.request.urlopen(f"https://pypi.org/pypi/{name}/json", timeout=20) as r: |
| 188 | + data = json.load(r) |
| 189 | + print(name, data["info"]["version"], data["info"].get("project_urls")) |
| 190 | +PY |
| 191 | +``` |
| 192 | + |
| 193 | +## 最短可执行清单 |
| 194 | + |
| 195 | +一次正常公开发布的最短路径是: |
| 196 | + |
| 197 | +1. `ksadk-web` 合入 GitHub `main`,由 GitHub workflow 发布 npm。 |
| 198 | +2. 内部 `ksadk-python/master` 记录版本、文档、approval evidence。 |
| 199 | +3. 从内部 master 生成 clean export。 |
| 200 | +4. 在 public candidate 运行 `make public-preflight`。 |
| 201 | +5. public candidate 通过 GitHub PR 合入公开 `main`。 |
| 202 | +6. 在公开 `main` commit 上打 `v<version>` tag。 |
| 203 | +7. 创建 GitHub Release 或手动触发 `publish-pypi.yml`。 |
| 204 | +8. workflow 发布 PyPI 并部署 GitHub Pages。 |
| 205 | +9. 运行 post-publish publication check。 |
| 206 | + |
| 207 | +这不是“提交 PR 到 main 后手工打 tag 和 release 文件”就结束。PR 到 `main` 只是公开源码同步;真正的 npm、PyPI、Pages 发布必须由 GitHub workflow 完成并通过发布后核对。 |
0 commit comments