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

发布时间:2026/9/18 18:57:50

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/9/18 18:57:50

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

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

2026/9/18 23:18:08

oh-my-hermes:统一 Hermes 配置管理,让 React Native 性能优化更简单

1. 项目缘起:为什么我会折腾一套 Hermes 配置管理方案先交代一下背景。我一直在做 React Native 相关的性能优化工作,接触 Hermes 引擎其实比大多数人要早。Hermes 是 Facebook 专门为 React Native 打造的那套 JavaScript 引擎,它在 Android…

2026/9/18 23:18:08

UE高级运动系统实战:数据流、动画融合与性能优化

1. 先把"高级运动系统"的边界划清楚1.1 高级运动系统究竟在解决什么问题刚接触 UE高级运动系统 的人,十有八九是被那种"转身会甩腿、跑动会压身、上下坡脚步能贴地"的角色手感吸引过来的。但真把工程拖进编辑器跑起来,往往第一反应是…

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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