FyAgent发布流水线揭秘:macOS公证、Windows签名与构建证明的CI/CD完整实践
【免费下载链接】fyagentFor You Agent——AI 时代的个人随身数字人格。把你的模型、AI 账号、技能、提示词和工作方式带到每一个 AI 工具里。项目地址https://gitcode.com/gh_mirrors/fy/fyagent点击查看免费下载FyAgent 是一款 AI 时代的个人随身数字人格工具能把你的模型、AI 账号、技能与提示词带到每一个 AI 客户端里。这篇文章将完整拆解它的发布流水线一次vX.Y.Z标签推送如何经过 macOS Developer ID 签名与公证、Windows 代码签名、构建证明Attestation最终变成一条不可篡改的正式 Release。一、为什么桌面应用的发布流水线必须多此一举浏览器里的一次部署失败可以回滚但桌面应用不同用户直接执行你签发的二进制——安装程序被篡改的后果由用户承担macOS 会主动拦截没有 Developer ID 签名和 Apple 公证Notarization的应用Gatekeeper 直接拒绝打开Windows 用户依赖数字签名判断安装程序是否可信。因此 FyAgent 的 Release 工作流设计目标只有八个字来源可证明、资产不可抵赖。整条流水线由 .github/workflows/release.yml 定义官方流程文档见 docs/fyagent/development/ci-release/release.md。它在标签触发时启动共 8 个 Job全部通过严格的needs依赖串联任何一环失败即整体失败fail closed。二、第一步冻结源码与发布资格校验Eligibility流水线从eligibilityJob 开始它做的是发布前的身份核验校验请求信封在 checkout 之前先验证事件来源是否为官方仓库、工作流 SHA 是否合法防止伪造的 dispatch 请求绑定标签与提交vX.Y.Z标签指向的 SHA 就是冻结源码运行期间main分支如何移动都不影响本次构建版本一致性标签号必须与 Cargo 工作区版本号完全一致漂移即失败双模式设计formal正式持有签名/公证密钥与preflight诊断拿不到任何签名密钥发布条件恒为假。这一步的输出——app_version、source_sha、workflow_sha——会像血统证明一样传递到后面所有 Job。三、第二步Windows 构建与四段式签名验证Windows 侧覆盖x64 与 ARM64 两种架构且强制要求同架构原生 Runnerwindows-2025与 ARM 原生 Runner并逐一核对 Node、pnpm、Rust 工具链版本任何一个版本漂移都会直接中止。签名链路拆成四个独立 Job形成构建者不能自证清白的分离设计阶段Job职责① 构建build-windowsTauri 构建 NSIS 打包随后证明产物严格未签名上传原始候选② 预检密封prove-windows-preflight在干净 Runner 上密封未签名候选生成签名片段③ 正式签名sign-windows-formal调用签名提供商对 exe 签名校验预期发布者与证书 SHA-256④ 独立密封seal-windows-formal全新 Runner独立复核签名、图标嵌入与提权清单产出最终安装程序关键细节签名模式由 scripts/release/windows-signing.mjs 统一管理signed/unsigned二选一unsigned 模式下签名密钥配置必须完全不存在防止半配置状态生成的 signing-status.json 使用固定 schemafyagent-windows-signing-status/v1发布说明中的 Windows 签名表格完全由它生成凭证永远不进入文档NSIS 安装脚本契约由 scripts/release/verify-windows-nsis-contract.mjs 在构建前后各验证一次安装脚本模板位于 src-tauri/nsis/installer.nsi。四、第三步macOS Developer ID 签名与 Apple 公证macOS 侧在macos-15上构建Universalarm64 x86_64应用流程由 scripts/release/macos-developer-id.sh 驱动导入证书Apple Root CA 与 Developer ID G2 CA 导入临时钥匙串脚本内置 apple-root-ca.cer 与 apple-developer-id-g2-ca.cer签名 .appcodesign深度签名后用 verify-macos-signed-app.sh 独立复核签名公证应用notarytool submit提交后轮询notarytool info直至 Apple 返回终态——而不是把notarytool wait的超时当作拒绝最长可等待 9000 秒Staple 票据把公证票据钉在 app 和 DMG 上离线环境也能通过校验样式化 DMGcreate-macos-dmg.sh 打包带背景图、Applications软链接和.DS_Store布局的安装镜像用户打开即可拖拽安装挂载复核DMG 会被只读挂载逐项验证版本号、Applications软链接目标、背景文件、主可执行文件 SHA-256 与签名前完全一致最后由 verify-macos-signed-dmg.sh 做终极校验。五、第四步构建证明Attestation与一次性发布签名只是谁签的构建证明回答的是在哪个环境、用哪份代码签的pin-release-build-inputs把所有签名前的构建输入打包成不可变 bundleverify-assets下载最终安装程序与证据生成 3 个安装程序 3 个机器可读证据文件共 6 个证明主体attest调用 GitHub 官方actions/attest生成Sigstore 构建证明 bundle与 3 个安装程序、3 个证据文件组装成恰好 7 个 Release 附件——多一个少一个都算失败publishJob 最后做一次性发布事务重新核验标签与 SHA、全量枚举已有 Release 防止重复、创建草稿 → 上传 →重新下载验证→ 才允许转正式发布。一旦发布版本即不可变若草稿残留还会通过 verify-release-draft-ownership.mjs 证明草稿归属后才能恢复杜绝误覆盖。对下载用户来说每个 Release 都附带 download-manifest.json由 scripts/generate-download-manifest.mjs 生成包含各平台资产的哈希与来源提交可独立核验。六、这套 CI/CD 实践的核心设计要点单一事实来源标签目标 SHA 冻结源码所有 Job 只认这个 SHA职责分离构建、签名、验证各在不同 Job甚至不同 Runner完成签名者无法自证原生构建三种架构全部在本机原生 Runner 上构建杜绝交叉编译的架构漂移Fail Closed任何不确定的状态草稿归属不明、发布结果未知都拒绝继续契约测试护航流水线本身也有测试如 tests/releaseWorkflow.test.ts、tests/windowsNsisContract.test.ts、tests/releaseAssets.test.ts脚本改了但契约没跟上会被 CI 直接拦下。七、延伸阅读发布流程官方说明docs/fyagent/development/ci-release/release.mdCI 持续集成流程说明docs/fyagent/development/ci-release/ci.md全部发布脚本目录scripts/release/版本与发布说明模板docs/release-notes/README.md这套冻结源码 → 原生构建 → 分离签名 → 公证 → 构建证明 → 一次性发布的流水线为任何发布桌面端的开源项目提供了一个可直接借鉴的 CI/CD 完整实践范本。赞分享【免费下载链接】fyagentFor You Agent——AI 时代的个人随身数字人格。把你的模型、AI 账号、技能、提示词和工作方式带到每一个 AI 工具里。项目地址https://gitcode.com/gh_mirrors/fy/fyagent点击查看免费下载相关推荐ILSpy macOS 发布全流程CI 无签名构建、离线签名公证与 DMG 打包实战ILSpy macOS 发布全流程CI 无签名构建、离线签名公证与 DMG 打包实战 本篇指南以 ILSpy 仓库中 BuildTools/packaging逆向工程开发工具桌面应用Rancher Desktop 发布签名指南Windows 与 macOS 的离线代码签名与公证完整流程Rancher Desktop 发布签名指南Windows 与 macOS 的离线代码签名与公证完整流程 导读 本文基于 Rancher Desktop 官方桌面应用云原生容器编排如何从源码构建 WhatCable 并签名发布构建、公证与 Homebrew 发布流水线完整指南如何从源码构建 WhatCable 并签名发布构建、公证与 Homebrew 发布流水线完整指南 WhatCable 是一款 macOS 菜单栏应用用大白话创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

YUM报错cannot find a valid baseurl?CentOS 7仓库下线修复指南

YUM报错cannot find a valid baseurl?CentOS 7仓库下线修复指南

遇到 YUM 报错 cannot find a valid baseurl for repo: base/7/x86_64?先别急着重装系统。这个报错看起来就像一行冷冰冰的地址失效提示,但真正经历的都知道,它背后是 CentOS 7 官方仓库整体下线后引发的一连串连锁反应。我最近半年在测试机、…

2026/10/11 18:49:04 阅读更多 →
开源工具拼一个「课堂计时器」:显示屏、翻页笔、提示音全套

开源工具拼一个「课堂计时器」:显示屏、翻页笔、提示音全套

培训机构的课堂要控制节奏:25分钟教学、10分钟练习、5分钟互动——老师拿手机看时间既不专业也容易忘。用开源工具拼了一套课堂计时系统,成本为零。 一、需求清单 📌 教室前屏显示当前环节与剩余时间 📌 老师手里的「遥控器」切换…

2026/10/11 18:49:04 阅读更多 →
04|ChatTemplate 实战:让提示词成为可维护的代码

04|ChatTemplate 实战:让提示词成为可维护的代码

04|ChatTemplate 实战:让提示词成为可维护的代码 《Eino 实战:用 Go 构建 AI 应用与智能体》 第 04 篇 关键词:ChatTemplate、FString、GoTemplate、Jinja2、MessagesPlaceholder、变量校验 前置条件:已完成 [03|ChatModel 实战](03|ChatModel 实战:消息、参数与多轮对…

2026/10/11 18:49:04 阅读更多 →

最新新闻

AI编程的真正瓶颈:协议、语境与交互的三重切换成本

AI编程的真正瓶颈:协议、语境与交互的三重切换成本

1. 切换成本:被所有人忽略的AI编程“隐性税”“模型越强,写代码越快”——这话听上去很美,但我在过去两年里带过三支不同技术栈的开发团队,从某高校实验室的算法验证项目,到某公司落地的跨平台业务系统,再到…

2026/10/11 19:39:35 阅读更多 →
HexEdit 十六进制编辑器实现:数据模型、内存映射与大文件优化

HexEdit 十六进制编辑器实现:数据模型、内存映射与大文件优化

简介:HexEdit 是一个在 GitHub 上开源维护的十六进制编辑器,能够以十六进制形式查看、搜索并修改二进制数据,适合开发人员调试程序、逆向工程师分析恶意样本,也适合普通用户手动修复损坏文件。这套资源正是该项目的完整源码包&…

2026/10/11 19:39:35 阅读更多 →
Ubuntu上安装GitKraken v6.5.1:deb与snap选型与踩坑排查

Ubuntu上安装GitKraken v6.5.1:deb与snap选型与踩坑排查

简介:面向Ubuntu 16.04及以上用户的GitKraken v6.5.1离线安装包,是一款广受开发者欢迎的跨平台Git图形化客户端。它将分支管理、合并冲突解决、代码托管平台集成等复杂操作转化为直观的可视化交互,适合希望提升版本控制效率的开发者与团队。压…

2026/10/11 19:39:35 阅读更多 →
智慧城市市容检测数据集:VOC+YOLO双格式标注与YOLOv8实战指南

智慧城市市容检测数据集:VOC+YOLO双格式标注与YOLOv8实战指南

简介:面向智慧城市街道场景的市容检测数据集,包含19263张实景图片及对应标注,覆盖11个目标类别,适合计算机视觉学习者与算法工程师基于YOLO等框架开展街道涂鸦、垃圾堆放、故障路灯等城市管理问题的自动识别研究。数据采用Pascal …

2026/10/11 19:39:35 阅读更多 →
基于OpenCV与CNN的驾驶员疲劳检测预警系统设计与实现

基于OpenCV与CNN的驾驶员疲劳检测预警系统设计与实现

简介:一套基于Python卷积神经网络的人脸识别驾驶员疲劳检测与预警系统完整项目,适用于毕业设计、课程设计与实际项目开发。系统通过摄像头实时采集人脸,综合打哈欠、眨眼、点头三种行为特征,并分析人脸朝向、眼睛开合度、眨眼频率…

2026/10/11 19:39:35 阅读更多 →
ISO 8373-2021:机器人互操作与合规验证的工程实践指南

ISO 8373-2021:机器人互操作与合规验证的工程实践指南

简介:本资源为国际标准化组织(ISO)于2021年11月发布的最新版机器人术语标准ISO 8373:2021官方英文原版PDF文档,面向工业机器人研发工程师、服务机器人产品设计师、高校自动化与机器人方向师生及标准研究者,旨在解决跨团…

2026/10/11 19:38:34 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/11 14:36:54 阅读更多 →