ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Switchyard发布工作流揭秘:从git tag到PyPI/crates.io的完整流水线

Switchyard发布工作流揭秘:从git tag到PyPI/crates.io的完整流水线 Switchyard发布工作流揭秘从git tag到PyPI/crates.io的完整流水线【免费下载链接】SwitchyardSwitchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible model selection, benchmarking, and cost/performance optimization.项目地址: https://gitcode.com/GitHub_Trending/switch/SwitchyardSwitchyard 是一个让 LLM 应用跨多个模型与提供商路由流量的控制平面同时保持 OpenAI 与 Anthropic 原生 API 兼容。那么这样一个 Rust 工作区 Python 包双栈项目是如何仅凭一条 git tag就把 1 Python 包和 7 个 Rust crate 安全送达 PyPI 与 crates.io 的本文揭秘其完整的发布工作流零手动上传、版本号零失误、中途失败还能安全重跑。 发布流水线总览一条 tag两个注册表Switchyard 的发布体系遵循「常规 CI 把关质量、tag 驱动正式出版、手动构建只产 artifact」的 OSS 标准路径完整说明见 docs/internal/release_workflow.md触发方式做什么产物去向PR / 推送 main 分支测试、lint、类型检查、Rust 检查、瘦身安装冒烟.github/workflows/ci.yml无纯质量门禁手动触发 dev 构建构建 1 个或全套.dev版本 wheelGitHub Actions artifact仅 1 天保留期推送vMAJOR.MINOR.PATCHtag完整发布校验 构建矩阵 正式出版PyPI crates.io GitHub Release这里藏着一个关键设计PyPI 版本一旦上传事实上不可变更所以正式发布只允许由根目录 tag 触发而分支状态的手动构建绝不允许污染公共索引。版本号的唯一真相来源则是 pyproject.tomlPython 包与 Cargo.tomlRust 工作区两者必须完全一致。 第一关tag 与版本号三重绑定推送 tag 后publish工作流.github/workflows/publish.yml的第一个 job 就做一次「三重绑定」校验格式校验—— tag 必须严格形如v数字.数字.数字任何v0.2.0-rc1之类的变体都会被拒绝Python 绑定—— tag 必须与pyproject.toml的version精确匹配包版本0.2.0只能配v0.2.0Rust 绑定—— Cargo 工作区版本必须与 Python 包版本相等。三重校验保证了「tag 即版本」从源头杜绝了 tag 与代码版本错位这种经典事故。 第二关Python 与 Rust 双语言质量门禁tag 通过后两条独立的检查流水线并行展开.github/workflows/publish.ymlPython 矩阵在 3.10 到 3.14 共5 个版本上逐一执行ruff check与完整测试套件Rust 工作区cargo fmt --check格式检查、cargo clippy以-D warnings零容忍运行、cargo test --workspace全量测试。任何一条失败都会让发布在出版之前终止——质量门禁全部位于「出版」上游顺序不可逆。 第三关构建 7 件套发布物校验通过后进入构建阶段产出 1 个 sdist 6 个平台 wheel源码包sdist用 maturin 构建 sdist 后工作流还会解包检查LICENSE与NOTICE是否齐全并在/tmp隔离目录做一次真实安装冒烟——确保用户pip install源码包时真的能装起来。wheel 矩阵6 平台平台构建方式Linux x86_64 / aarch64manylinux2014 容器内构建兼容主流 Linux 发行版macOS x86_64 / arm64原生构建Windows x86_64 / arm64原生构建所有 wheel 均为abi3格式一份 wheel 通吃多个 Python 版本。在可执行的平台上工作流还会分别在Python 3.10 和 3.14两个端点做强制重装冒烟导入验证switchyard、switchyard_rust及原生扩展均可正常加载.github/workflows/publish.yml。 第四关零 Token 发布 PyPITrusted Publishing注意 PyPI 的包名是nemo-switchyard而 Python 导入名与 CLI 仍叫switchyard。正式出版由publishjob 执行.github/workflows/publish.ymluv publish --trusted-publishing always dist/*它不依赖任何存储的 API 密钥而是使用PyPI Trusted PublishingGitHub 凭 tag 事件 匹配的待发布出版方项目nemo-switchyard、工作流publish.yml、环境pypi自动换取临时凭证。凭证不落库、不轮换、不泄露——这是目前最安全的 PyPI 发布姿势。发布成功后工作流还会顺手创建 GitHub Release。 第五关7 个 Rust crate 按依赖顺序发布同一个 tag 还会把 Rust 工作区的 7 个 crate 依序送上 crates.io顺序严格遵循依赖方向.github/workflows/publish.ymlswitchyard-protocol协议契约switchyard-translation格式转换switchyard-libsy可组合路由算法库switchyard-llm-client模型客户端prefill-router预填充路由switchyard-runner运行器switchyard-server独立服务端三个工程细节值得借鉴版本再确认发布前用cargo metadata核对 7 个 crate 的版本都与 tag 一致防止漏改等待索引同步每发一个 crate 后轮询 crates.io 索引最长 30 × 10 秒确认它可见后才发布依赖它的下一个幂等可重跑若某 crate 已存在则直接跳过。因此中途失败时只需在 GitHub 上点击Re-run failed jobs已成功发布的 crate 不会被重复推送。️ 番外不发 PyPI 的 dev 构建想在正式切 tag 之前验证发布矩阵publish.yml提供了两个手动开关docs/internal/release_workflow.md开关效果build_dev_artifact true仅构建 1 个 Linux x86_64 dev wheelartifact 保留 1 天随后下载回来核对Name/Version元数据build_dev_matrix true构建完整 sdist wheel 矩阵仅作为 artifact 保存绝不发布dev 版本号遵循 PEP 440 的.dev规范如0.0.1.dev0由 scripts/release/set_dev_wheel_version.py 打戳到pyproject.toml本地也能预览python scripts/release/set_dev_wheel_version.py 0.0.1.dev0 --print-version提示除非发布流程明确要求不要把打戳后的元数据提交回仓库。 核心要点速记3 处版本号强绑定git tag pyproject.toml Cargo 工作区版本任何一处不符立即失败2 种发布凭证策略PyPI 用 Trusted Publishing零密钥crates.io 用CARGO_REGISTRY_TOKEN仓库 Secret6 平台 wheel 5 个 Python 版本测试全部通过才允许出版失败可恢复crate 发布幂等设计 GitHub「Re-run failed jobs」成功步骤不重跑版本记录每个正式版的变更说明统一沉淀在 CHANGELOG.md遵循 Keep a Changelog 与语义化版本规范。整套流水线的精髓一句话让「出版」成为整条链路中唯一不可逆的动作它之前的每一步都是可重复、可验证、可失败的。对任何同时维护 Python 与 Rust 双栈的项目来说这套从 tag 到 PyPI/crates.io 的完整发布工作流都值得直接抄作业。【免费下载链接】SwitchyardSwitchyard lets LLM applications route traffic across models and providers while preserving native OpenAI and Anthropic API compatibility - enabling flexible model selection, benchmarking, and cost/performance optimization.项目地址: https://gitcode.com/GitHub_Trending/switch/Switchyard创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表