|
| 1 | +# Release Guide |
| 2 | + |
| 3 | +本文档记录 `bk-plugin-framework-python` 的 Python 包发布流程。文档只描述公开的仓库路径、版本规则和验证方式,不记录任何账号、令牌、密钥、私有索引凭据或内部环境地址。 |
| 4 | + |
| 5 | +## 包划分 |
| 6 | + |
| 7 | +仓库内有两个独立发布的 Poetry 包: |
| 8 | + |
| 9 | +| 包 | 目录 | 版本文件 | Tag 前缀 | |
| 10 | +| --- | --- | --- | --- | |
| 11 | +| `bk-plugin-runtime` | `runtime/bk-plugin-runtime` | `runtime/bk-plugin-runtime/pyproject.toml`、`runtime/bk-plugin-runtime/bk_plugin_runtime/__version__.py` | `bk-plugin-runtime-v` | |
| 12 | +| `bk-plugin-framework` | `bk-plugin-framework` | `bk-plugin-framework/pyproject.toml`、`bk-plugin-framework/bk_plugin_framework/__version__.py` | `bk-plugin-framework-v` | |
| 13 | + |
| 14 | +`bk-plugin-framework` 会在 `pyproject.toml` 中依赖一个明确版本的 `bk-plugin-runtime`。如果 runtime 也要发布新版本,先发布 runtime,再把 framework 的 runtime 依赖更新到新版本后发布 framework。 |
| 15 | + |
| 16 | +## 什么时候发布哪个包 |
| 17 | + |
| 18 | +- 只改了 `bk-plugin-framework/` 下的 framework 代码或资源:只发布 `bk-plugin-framework`。 |
| 19 | +- 只改了 `runtime/bk-plugin-runtime/` 下的 runtime 代码或资源:发布 `bk-plugin-runtime`;如果 framework 需要依赖这个新 runtime,再继续发布 `bk-plugin-framework`。 |
| 20 | +- 两边都有改动:先发布 `bk-plugin-runtime`,再发布 `bk-plugin-framework`。 |
| 21 | +- 只改文档、示例或不进入包产物的内容:通常不需要发布包。 |
| 22 | + |
| 23 | +发布前用最近一个已发布 tag 到目标提交的 diff 判断影响范围,例如: |
| 24 | + |
| 25 | +```bash |
| 26 | +git diff --name-status <last-framework-tag>..origin/master -- bk-plugin-framework runtime |
| 27 | +git diff --name-status <last-runtime-tag>..origin/master -- runtime |
| 28 | +``` |
| 29 | + |
| 30 | +## 版本规则 |
| 31 | + |
| 32 | +正式版本使用普通语义化版本号,例如: |
| 33 | + |
| 34 | +```text |
| 35 | +2.3.13 |
| 36 | +``` |
| 37 | + |
| 38 | +rc 包使用 PEP 440 兼容的预发布版本号,不加横线,例如: |
| 39 | + |
| 40 | +```text |
| 41 | +2.3.13rc0 |
| 42 | +2.3.13rc1 |
| 43 | +``` |
| 44 | + |
| 45 | +版本号需要同时更新对应包的 `pyproject.toml` 和 `__version__.py`。如果 framework 依赖了新的 runtime 版本,还需要同步更新 `bk-plugin-framework/pyproject.toml` 中的 `bk-plugin-runtime` 版本。 |
| 46 | + |
| 47 | +## 发布前检查 |
| 48 | + |
| 49 | +1. 拉取远端分支和 tag: |
| 50 | + |
| 51 | +```bash |
| 52 | +git fetch origin --tags --prune |
| 53 | +``` |
| 54 | + |
| 55 | +2. 确认目标版本的 tag 不存在: |
| 56 | + |
| 57 | +```bash |
| 58 | +git tag --list 'bk-plugin-framework-v<version>' |
| 59 | +git tag --list 'bk-plugin-runtime-v<version>' |
| 60 | +git ls-remote --tags origin 'bk-plugin-framework-v<version>' |
| 61 | +git ls-remote --tags origin 'bk-plugin-runtime-v<version>' |
| 62 | +``` |
| 63 | + |
| 64 | +3. 确认版本文件一致: |
| 65 | + |
| 66 | +```bash |
| 67 | +rg -n 'version = "|__version__' bk-plugin-framework/pyproject.toml bk-plugin-framework/bk_plugin_framework/__version__.py |
| 68 | +rg -n 'version = "|__version__' runtime/bk-plugin-runtime/pyproject.toml runtime/bk-plugin-runtime/bk_plugin_runtime/__version__.py |
| 69 | +``` |
| 70 | + |
| 71 | +4. 本地构建验证。若本机已安装 Poetry: |
| 72 | + |
| 73 | +```bash |
| 74 | +cd bk-plugin-framework |
| 75 | +poetry build -vvv |
| 76 | + |
| 77 | +cd ../runtime/bk-plugin-runtime |
| 78 | +poetry build -vvv |
| 79 | +``` |
| 80 | + |
| 81 | +也可以用临时隔离环境运行 CI 同款 Poetry 版本: |
| 82 | + |
| 83 | +```bash |
| 84 | +cd bk-plugin-framework |
| 85 | +uv run --no-project --python 3.10 --with poetry==1.8.5 poetry build -vvv |
| 86 | + |
| 87 | +cd ../runtime/bk-plugin-runtime |
| 88 | +uv run --no-project --python 3.10 --with poetry==1.8.5 poetry build -vvv |
| 89 | +``` |
| 90 | + |
| 91 | +只需要构建本次要发布的包。构建产生的 `dist/` 是本地临时产物,不要提交。 |
| 92 | + |
| 93 | +5. 检查 wheel 元数据中包名、版本号和关键依赖是否符合预期: |
| 94 | + |
| 95 | +```bash |
| 96 | +python - <<'PY' |
| 97 | +from pathlib import Path |
| 98 | +import zipfile |
| 99 | +
|
| 100 | +wheel = next(Path("dist").glob("*.whl")) |
| 101 | +with zipfile.ZipFile(wheel) as zf: |
| 102 | + metadata = [name for name in zf.namelist() if name.endswith("METADATA")][0] |
| 103 | + for line in zf.read(metadata).decode().splitlines(): |
| 104 | + if line.startswith(("Name:", "Version:", "Requires-Dist: bk-plugin-runtime")): |
| 105 | + print(line) |
| 106 | +PY |
| 107 | +``` |
| 108 | + |
| 109 | +## 发布步骤 |
| 110 | + |
| 111 | +以下命令以 framework 为例。runtime 发布时替换目录、版本文件和 tag 前缀即可。 |
| 112 | + |
| 113 | +1. 修改版本文件: |
| 114 | + |
| 115 | +```text |
| 116 | +bk-plugin-framework/pyproject.toml |
| 117 | +bk-plugin-framework/bk_plugin_framework/__version__.py |
| 118 | +``` |
| 119 | + |
| 120 | +2. 提交版本变更: |
| 121 | + |
| 122 | +```bash |
| 123 | +git add bk-plugin-framework/pyproject.toml bk-plugin-framework/bk_plugin_framework/__version__.py |
| 124 | +git commit -m "minor: bump bk-plugin-framework version to v<version>" |
| 125 | +``` |
| 126 | + |
| 127 | +3. 推送发布提交: |
| 128 | + |
| 129 | +```bash |
| 130 | +git push origin HEAD:master |
| 131 | +``` |
| 132 | + |
| 133 | +4. 创建并推送轻量 tag: |
| 134 | + |
| 135 | +```bash |
| 136 | +git tag bk-plugin-framework-v<version> |
| 137 | +git push origin bk-plugin-framework-v<version> |
| 138 | +``` |
| 139 | + |
| 140 | +tag 推送后,仓库中的发布 workflow 会自动构建并发布对应包。发布凭据由仓库 CI 环境统一管理,文档、提交信息和命令记录里都不要写任何凭据内容。 |
| 141 | + |
| 142 | +## rc 包发布 |
| 143 | + |
| 144 | +rc 包和正式包使用同一套 tag 触发流程,差异只在版本号。 |
| 145 | + |
| 146 | +示例: |
| 147 | + |
| 148 | +```text |
| 149 | +bk-plugin-runtime-v2.2.0rc0 |
| 150 | +bk-plugin-framework-v2.4.0rc0 |
| 151 | +``` |
| 152 | + |
| 153 | +如果 framework rc 依赖 runtime rc,需要先发布 runtime rc,然后在 framework 的 `pyproject.toml` 中精确依赖该 runtime rc: |
| 154 | + |
| 155 | +```toml |
| 156 | +bk-plugin-runtime = "2.2.0rc0" |
| 157 | +``` |
| 158 | + |
| 159 | +验证 rc 包时建议精确指定版本: |
| 160 | + |
| 161 | +```bash |
| 162 | +pip install bk-plugin-framework==<version> |
| 163 | +pip install bk-plugin-runtime==<version> |
| 164 | +``` |
| 165 | + |
| 166 | +不要只依赖宽松版本范围来验证 rc 包,因为 Python 包管理器默认通常不会在普通版本范围里自动选择预发布版本。 |
| 167 | + |
| 168 | +## 发布后验证 |
| 169 | + |
| 170 | +1. 确认远端 master 和 tag 指向预期提交: |
| 171 | + |
| 172 | +```bash |
| 173 | +git ls-remote origin refs/heads/master refs/tags/bk-plugin-framework-v<version> |
| 174 | +git ls-remote origin refs/heads/master refs/tags/bk-plugin-runtime-v<version> |
| 175 | +``` |
| 176 | + |
| 177 | +2. 确认发布 workflow 成功完成。可以在 GitHub Actions 页面查看对应 tag 触发的 run,或使用 GitHub CLI 查询。 |
| 178 | + |
| 179 | +3. 确认包索引可见: |
| 180 | + |
| 181 | +```bash |
| 182 | +python -m pip index versions bk-plugin-framework --pre |
| 183 | +python -m pip index versions bk-plugin-runtime --pre |
| 184 | +``` |
| 185 | + |
| 186 | +4. 如需安装验证,精确指定版本: |
| 187 | + |
| 188 | +```bash |
| 189 | +pip install bk-plugin-framework==<version> |
| 190 | +pip install bk-plugin-runtime==<version> |
| 191 | +``` |
| 192 | + |
| 193 | +## 不要写入文档或提交记录的信息 |
| 194 | + |
| 195 | +- PyPI、包索引、GitHub 或其他系统的账号、令牌、密钥、cookie。 |
| 196 | +- CI secrets 的具体值。 |
| 197 | +- 私有环境的上传地址、临时调试地址或带鉴权参数的 URL。 |
| 198 | +- 个人机器上的一次性路径、一次性 session、一次性 workflow 日志全文。 |
| 199 | + |
| 200 | +可以记录公开的仓库路径、workflow 文件路径、tag 规则、版本号规则、验证命令和失败排查结论。 |
0 commit comments