Release failure notification
Release failure notification 指一个仓库为所有“预期成功但最终以 failure 结束”的交付 workflow 建立显式、可审查的告警路径。范围包括 release、deploy、CI、Docs Pages 和 required gate,但必须由 checked-in allowlist 声明;成功、skipped、cancelled 和通知 workflow 自身不属于通知条件。
- 运维
- 工具
目录
Definition
Release failure notification 指一个仓库为所有“预期成功但最终以 failure 结束”的交付 workflow 建立显式、可审查的告警路径。范围包括 release、deploy、CI、Docs Pages 和 required gate,但必须由 checked-in allowlist 声明;成功、skipped、cancelled 和通知 workflow 自身不属于通知条件。典型形态是一个很薄的 workflow_run sidecar:它监听声明过的 workflow,解析足够的 run metadata 来定位失败 commit 或 PR,再交给已被该项目选定的 delivery。它不是 GitHub 默认邮件通知,不是把 delivery 凭据硬塞进每个 publish job,也不是手工 checklist。这个 Topic 的合同是 sidecar、metadata、失败上下文与 workflow 分类;transport、外部 notifier、secret 名称和渠道不属于默认值(projects/blog-26.md、projects/flux-purr.md、projects/dockrev.md)。
这个 Topic 也暗含一个安全边界:任何带 secret 的通知 workflow 都不应执行 caller repository code。若项目已选择 reusable workflow,它只应接收 metadata、格式化 payload、调用 delivery action,而不是 checkout 调用方代码后再发送消息。对 release workflow 可以保留 identity-aware 专用 payload;对普通 expected-success workflow 应使用 metadata-only generic payload,不能伪造版本、tag 或 same-SHA recovery。
When to use
当 repo 有自动 release、deploy、image publish、Pages publish、CI 或其他 required gate,并且失败不应依赖人去轮询 GitHub Actions 时,应使用这个 Topic。它尤其适用于 label-driven 或 queued release,也适用于 Docs Pages/CI 等没有 release identity 但仍然预期成功的 workflow;前者保留 PR intent、commit SHA、component、channel、run attempt,后者至少保留 workflow、event、ref/branch、head SHA、PR、run ID、run attempt、actor 和 run URL(projects/blog-26.md、projects/flux-purr.md、projects/codex-vibe-monitor.md、projects/dockrev.md)。
当 release decision 来自 PR labels 时,通常应与 PR label release 一起使用。发布失败通知需要带上产生 release intent 的同一组上下文,否则 maintainer 只能看到“release failed”,却不知道是哪个 component/channel/bump 出错(projects/flux-purr.md、projects/xp.md)。
对使用 PR-local VERSION 发布链路的产品,通知还必须区分真正的 publish/deploy failure 与成功的 non-product skip。一个 release failure payload 应绑定已锁定的 VERSION、merged main SHA 与 recovery target;若 tag 已可确定,也应一并带上。type:docs / type:skip 令 release workflow 成功 skip 时,不应触发失败通知;只有实际的 failure conclusion 才进入本 Topic(projects/flux-purr.md、topics/pr-label-release.md、projects/dockrev.md)。
不要仅因为 repo 有 GitHub Actions 或发现一个跨仓库 reference 就套用这个 Topic。普通 CI workflow 加 GitHub 默认通知不够;项目必须有明确命名的 notification workflow,或有等价的 checked-in delivery contract(skills/style-playbook/references/data/topics/release-failure-notification.json)。
Habits / defaults
- notifier 应作为 sidecar workflow 存在,由
workflow_run或workflow_dispatch触发。Release workflow 负责 build、versioning、signing、upload、publish;notifier workflow 负责上下文格式化与 alert delivery(projects/blog-26.md、projects/flux-purr.md)。 - 把 expected-success workflow 写入 checked-in allowlist,并把每个 top-level workflow name 精确归类为 generic、Release-specific 或 excluded;contract test 应在新增 workflow 未分类、通知 workflow 漏排除或 route 漂移时失败。Dockrev 的
.github/release-failure-notification.json与.github/scripts/test_workflow_failure_notification_contract.py是直接样本(projects/dockrev.md)。 - generic sidecar 只订阅 allowlist 中的 workflow,并在 job 内显式 guard
workflow_run.conclusion == failure;Release继续走 identity-aware sidecar,避免同一失败重复通知或把 ordinary failure 描述成发布失败(projects/dockrev.md)。 - 只有项目证据证明多个调用方已经选择相同 transport 时,才可把 secret-using delivery 集中到 reusable workflow。共享实现不建立调用方的 transport 选择。
- 带 secret 的 notifier 不应 checkout 或执行不可信 caller code。任何共享 workflow 的价值都在于它只接收 metadata 和已选定的 secret,再发送消息。
- 通知 payload 要保存失败上下文,而不是只写 "release failed"。有用字段包括 repository、workflow name、conclusion、run URL、ref label、head SHA、run attempt、actor、event name,以及 manual dispatch 更改 target SHA 时从 logs 解析出来的 extra details(
projects/blog-26.md)。 - generic workflow payload 至少要有 repository、workflow、event、ref/branch、head SHA、PR、run ID、run attempt、actor 和 run URL,并提供检查失败 job 后再重跑的 recovery guidance;它不应生成版本或 tag 结论(
projects/dockrev.md)。 - PR-local
VERSION发布链路的 payload 还应带VERSION、merged main SHA 与 recovery operation;tag 已确定时一并带上,避免维护者把同一锁定版本误当作下一版本重发(projects/flux-purr.md、topics/pr-label-release.md)。 - 已选定 transport 后保留
workflow_dispatchsmoke test。通知链路是基础设施;配置迁移或 delivery 变更后,需要便宜的人工验证路径(projects/kaisoumail.md)。 - 缺少已选定 transport 的配置应作为错误显式暴露,而不是静默跳过通知。Delivery workflow 应明确 configuration owner、required secrets 和 permissions。
Transport selection gate
- 从
skills/policies/release-failure-notification/assets/templates/release-failure-notification-transport-gate.example.json开始。该 gate 要求在 rollout 前记录项目既有合同,或记录主人明确选择;reference library 不能单独作为选择证据。 - 在选择证据缺失时,阻断 notifier rollout:不得新增外部 notifier、secret 或渠道,也不得以静默 skip 伪装为已配置通知。
- 选择完成后,记录 transport owner、configuration owner 和 required secrets;选定配置缺失时必须 fail closed,并让 notifier run 显式失败。
Reference implementations
- 当前 Playbook 没有默认 transport 或默认 reusable notifier。任何新的 reference implementation 必须先有项目选型证据,不能由组织级 workflow 或历史样例反推。
blog-26、kaisoumail与flux-purr可用于复核 sidecar 的事件过滤、payload 与 release identity;它们不选择调用方的 transport(projects/blog-26.md、projects/kaisoumail.md、projects/flux-purr.md)。dockrev:.github/release-failure-notification.json维护 expected-success allowlist;Notify failed release保留 Release identity/same-SHA recovery,Notify failed workflow覆盖CI (PR)、Docs Pages、Release completion、Release Preparation和Review Policy,并从默认分支 checkout trusted helper(projects/dockrev.md)。
Failure modes
- 把 chat delivery 直接嵌进 release workflow,会让 release YAML 更难审查,也可能让通知失败被 publish 失败掩盖。优先使用围绕 failed run metadata 的 sidecar workflow(
projects/blog-26.md)。 - 使用
workflow_run却不检查 conclusion、branch、event、repository,会制造噪音或安全问题。Caller workflow 应显式 guard failure conclusion 和 same-repository release run(projects/blog-26.md)。 - 在 secret-bearing notifier 中执行 caller code 会扩大信任边界。Reusable notifier 只应格式化 metadata 并调用 delivery action,不应 clone caller repo。
- Alert payload 缺少 commit SHA、run URL、actor 时,排查会很慢。Actions UI 积累很多 runs 后,通知必须能让 maintainer 直接跳到失败 run(
projects/blog-26.md)。 - 把 manual dispatch 当成普通
workflow_run处理,可能报告错误 target SHA。若支持 backfill,应从 workflow inputs 或 logs 中解析真实 release target(projects/blog-26.md)。 - 将 successful skip 视为失败,会制造噪音并掩盖真实 publish/deploy failure。对于 PR-local
VERSION发布链路,应只通知失败的 release,并显示可 recovery 的同一 main identity(topics/pr-label-release.md)。 - 只把
Release或某一个 Docs workflow 放进通知范围,会漏掉其他已经声明为 expected-success 的 CI、gate 或 release-preparation failure;allowlist、route 和实际 workflow names 必须由同一个 contract test 维护(projects/dockrev.md)。 - generic notifier checkout failed workflow 的 PR head 或 caller code,会把失败事件变成不可信代码执行边界;应只 checkout 默认分支的 trusted helper,并把失败 run 当作 metadata 输入(
projects/dockrev.md)。 - 把组织级 reference 或历史实现当作项目默认 transport,会无证据引入外部 notifier、secret 或渠道。必须先通过 transport selection gate;未选定时阻断 rollout,选定配置缺失时显式失败。
Evidence index
projects/blog-26.mdprojects/kaisoumail.mdprojects/flux-purr.mdprojects/dockrev.mdtopics/pr-label-release.mdskills/policies/release-failure-notification/assets/templates/release-failure-notification-transport-gate.example.jsonskills/style-playbook/references/data/topics/release-failure-notification.json
相关内容
Ivan's Blog 2026
项目实践Ivan's Blog 2026 是 Ivan 博客平台的公开开源镜像,由 Astro public site、Vite/React admin SPA 和 Bun gateway/API 组成。README.md、astro.config.mjs、apps/admin/、src/server/ 和 package.
Codex Vibe Monitor
项目实践Codex Vibe Monitor 是面向自部署的 OpenAI 兼容代理观测工作台:它接入 /v1/* HTTP / WebSocket 流量,将调用留证、实时 SSE、历史统计、请求排障、上游账号池、forward proxy、价格目录和 SQLite 持久化收在同一套运营界面中。
Dockrev
项目实践Dockrev 是 self-hosted Docker/Compose update manager。README.md 把根文档定位为快速入口,完整部署、使用、运维、排障和 API 文档在 docs-site/,这说明它是运维工具而不是普通 CRUD 管理台。
Flux Purr
项目实践Flux Purr 是 embedded firmware + React control console 的设备 mono-repo。README.md 将仓库组织为 firmware/、web/、tools/flux-purr-devd/、docs/specs/、docs/hardware/、.
FUSB302 Rust PHY Driver
项目实践fusb302 是面向 FUSB302B/FUSB302BMPX 的 no_std Rust USB Type-C 和 USB Power Delivery BMC PHY driver。它提供寄存器级控制、Type-C 电气控制、VBUS comparator、interrupt/FIFO 和 PD packet transport;README.
IsolaRail
项目实践IsolaRail 是当前 V3 四口 USB hub 的 owner-facing control plane 仓库。README.md 把它定义为 ESP32-S3 + CH335F + M24C64@0x50 + EN1..
KaisouMail
项目实践KaisouMail 是 Cloudflare temporary email platform,基于 Email Routing、Workers、D1、R2,以及 React + shadcn/ui control plane。README.md 和 README.zh-CN.md 同时存在,说明文档需要中英双语入口;公开 docs site 与 Storybook 也是产品交付面,而不只是开发辅助。
LoadLynx
项目实践LoadLynx 是 STM32G431 + ESP32-S3 便携式电子负载。README.md 明确采用分体式架构:STM32G431 执行快速电流/功率闭环与保护,ESP32-S3 负责 UI/Wi-Fi/OTA/记录/标定及上位机桥接。这是典型 device mono-repo,不能只从一个 firmware 目录理解。
OctoRill
项目实践OctoRill 把与 Ivan 相关的 GitHub 动态整理成适合持续阅读的工作区:发布更新、获星/关注动态、日报和 Inbox,发布内容还支持中文翻译和要点整理。README.md 同时指向 public docs-site、quick start、config、product 和 internal docs,说明它是产品化 Rust 服务 + React UI + 文档站,而不是一次性脚本。
Oidrune
项目实践Oidrune 是一个由运营者控制的 GitHub Actions 通知中继:它验证短期 GitHub OIDC 身份,只接受已批准来源的 workflow completion event,并把调用方提供的规范化正文投递到一个运营者控制的 Telegram destination。
Proxy Broker
项目实践Proxy Broker 是 standalone Rust service,用于加载 mihomo subscriptions,按 IP 构建带 probe/geo metadata 的代理池,按选择的 IP 开关本地 proxy listener sessions,并从同一 binary 提供 Bun-built operator web console。README.
TelevyBackup
项目实践TelevyBackup 是 macOS desktop backup app + Rust backend。README.md 标记为 work in progress,但已经有 Rust workspace、macOS app build/run scripts、packaging 和 release workflow,说明它不是单 crate 实验。
Tuckmark
项目实践Tuckmark 是一个 agent-native label printing workspace,统一承载打印机发现、能力探测、模板渲染、批量预览、位图打印,以及 CLI、MCP、HTTP 和 Web surfaces(README.md)。
XP Cluster Manager
项目实践XP Cluster Manager 是 self-hosted multi-host Xray cluster manager。README.md 明确每台 host 运行 xp 和 xray 两个进程,xp 用 OpenRaft 保存 cluster-wide desired state,并通过 Xray gRPC API reconcile 本地 runtime。
release-failure-notification
规则Define actionable, privacy-safe context for notifying maintainers when an expected-success workflow fails.