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

发布时间:2026/11/11 21:23:34

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),仅供参考
延伸阅读

更多相关文章

2026/11/11 21:23:32

三步部署自托管 RSS 阅读器,公众号更新一个不漏

三步部署自托管 RSS 阅读器,公众号更新一个不漏 【免费下载链接】wewe-rss 🤗更优雅的微信公众号订阅方式,支持私有化部署、微信公众号RSS生成(基于微信读书) 项目地址: https://gitcode.com/GitHub_Trending/we/wew…

2026/11/11 21:22:16

西藏找帮忙考电工证怎么避坑?电子证书怎么查?全攻略来了

西藏找帮忙考电工证怎么避坑?电子证书怎么查?全攻略来了 你是不是也遇到过这种情况, 不知道去哪报名怕被中介坑 ,网上一搜“西藏找帮忙考电工证”,结果信息乱七八糟,价格参差不齐,甚至还有人推荐你去“代办”——听起来很省事,但背后可能藏着大隐患…

2026/11/11 21:22:16

考电工证政府补贴流程值不值得考?南阳企业负责人亲测避坑指南

考电工证政府补贴流程值不值得考?南阳企业负责人亲测避坑指南 怕考不过白交培训费?考电工证政府补贴流程值不值得考,这是南阳市一家中小型建筑施工企业负责人张总最近最头疼的问题。他所在的企业正在承接一个新项目,急需一批持证上岗的电工,但市场上持证…

2026/11/11 21:22:16

电工证上哪报名考?别被中介坑了,这样报名更靠谱

电工证上哪报名考?别被中介坑了,这样报名更靠谱 你是不是还在到处问“电工证在哪考”?是不是担心自己被中间人骗钱?其实,报名考电工证没那么复杂,只要掌握正确的方式,就能避免被坑,顺利拿到证书。…

2026/11/11 21:22:15

电工证考完怎么查成绩 良心建议教你别白交培训费

电工证考完怎么查成绩 良心建议教你别白交培训费 怕考不过白交培训费?你不是一个人,很多刚考完电工证的朋友都在问:“ 电工证考完怎么查成绩 ?”其实,查成绩这件事不难,关键是要搞清楚流程、知道在哪里查,更要知道怎么避免走弯路, 良心建议…

2026/11/11 21:17:14

住建厅特种工继续教育怎么考?真实经历告诉你怎么避开中介陷阱

住建厅特种工继续教育怎么考?真实经历告诉你怎么避开中介陷阱 你是不是也遇到过这种情况:报名特种工继续教育,结果被一堆培训机构忽悠,花了几千块,最后连个证书都没拿到?别急,我之前也踩过坑,今天就从真实经历出发,告诉你怎么在住建厅特种工继续教育…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑