Files
honey-biscuit-workshop/templates/finalize.yml.tmpl
T
Catty Steve 117660d5c4 feat(baker/finalize): notification system and consolidate status types
- Rename types/build_status.rs to types/buildstatus.rs
- Rename StageInfo.sub_stage field to substage for consistency
- Move notification logic from finalize to dedicated notify module
- Remove notification module from finalize (moved to notify)
- Add notify module with event queuing, retry, and priority scheduling
- Add exponential backoff for temporary notification failures
- Implement plugin filtering by name list during registration
- Add fetch_plugins helper for batch plugin download
- Update finalize plugin registration to accept optional plugin filter
- Fix finalize config template indentation for notification policy
- Move all YAML templates to templates/ directory
2026-04-23 16:18:20 +08:00

369 lines
13 KiB
Cheetah
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# finalize.yml.tmpl
#
# 蜜饼工坊 (HoneyBiscuitWorkshop) 构建流水线 - 完成阶段配置
#
# 版本号,用于格式兼容性检查
# 版本迁移系统内置,预期 1.0 后不再变更 schema
version: "0.0.1"
# =============================================================================
# 插件定义
# =============================================================================
# 插件在 finalize 阶段执行特定任务(如推送镜像、上传制品等)
# 插件可以是 Shell 脚本或 Rhai 脚本,由文件扩展名自动检测
#
# 插件来源格式:
# git://<git-url>@<tag>/<commit> - Git 仓库(在 prebake 阶段拉取)
# https://<url> - HTTPS 下载(支持脚本直接下载)
# file://<path> - 本地文件(在 finalize.begin 阶段加载)
# http://<url> - HTTP 下载(计划支持)
# hg://<url> - Mercurial 仓库(计划支持)
#
# 插件隔离:
# - Docker/VM 环境:允许任意插件,由环境提供隔离
# - Bare-metal 环境:需要额外权限配置(PIP: Pipeline Implicit Parameters
#
# 插件通信:
# - Shell 脚本:通过命令行参数和环境变量接收配置
# - Rhai 脚本:通过注入的对象/函数接收配置(WIP)
# - 返回值:通过退出码表示成功/失败
# - 日志:会被捕获但不作为执行证据
plugin:
# 插件逻辑名称,用于在 artifact.publish 和 notification 中引用
# 名称必须唯一,不可重复定义
docker-push:
# 插件来源 URI,包含版本锁定
# @main/1234abcd 表示 main 分支的 1234abcd 提交
# 如果该提交不在指定分支中,则执行失败
"git://github.com/user/hbw-finalize-docker-push@main/1234abcd":
# 认证主机,仅用于认证目的
# 如果 publish 中指定了 image 且包含主机部分,此处可省略
host: "docker.io"
# 用户凭证,支持模板变量
# {{ variable.xxx }} 为用户配置值
# {{ secret.xxx }} 为从 Vault 获取的密钥
user: {{ variable.dockerhub.user }}
token: {{ secret.dockerhub.token }}
# fallible: 是否允许失败
# true - 插件失败不会导致构建失败,错误不会向上传播
# false - 插件失败会导致构建失败
# 语义与 bake.sh 的 @fallible 装饰器相同
fallible: false
# 镜像安全检查插件示例(HTTPS 下载)
image-check:
"https://example.com/trivy/trivy.sh":
user: {{ variable.trivy.user }}
password: {{ secret.trivy.password }}
fallible: true
# 短信通知插件示例(本地 Rhai 脚本)
sms-notify:
"file://.workshop/plugins/sms-notify.rhai":
provider: "aliyun"
access_key: {{ secret.aliyun.sms_key }}
access_secret: {{ secret.aliyun.sms_secret }}
# =============================================================================
# 通知配置
# =============================================================================
# 通知采用优先级组机制:
# - 优先级为整数,范围 0 ~ INT_MAX
# - 数值越小优先级越高
# - 同一优先级组内的通知方式并行执行
# - 当组内任一方式失败时,触发下一优先级组(fallback)
# - fallible: true 可阻止错误传播,不触发 fallback
#
# 系统级 fallback(在用户配置之外):
# 1. 站内通知(存储在数据库,显示在 Baker Dashboard
# 2. 系统邮件(用户创建时配置)
# 3. 放弃通知,管理员接收告警(如已配置)
#
# 优先级组为空时会产生警告,但不会自动修正
# 建议将优先级设为 0、1、2... 等连续值
notification:
# 最高优先级组 - 首选通知方式
0:
# Webhook 通知
webhook:
url: "https://example.com/hook"
# schema 定义负载格式:
# - "default": 使用插件内置的默认格式
# - "custom": 自定义格式,需要提供 on_* 模板
# 当设置 on_success/on_failure 时,schema 隐式为 "custom"
schema: "default"
# Satori 协议通知(如 Koishi
satori:
url: "http://127.0.0.1:5140/satori/v1/message.create"
token: "Bearer {{ secret.koishi_token }}"
schema: "custom"
# on_success: 构建成功时发送的内容
# 支持模板变量:
# {{ build.status }} - 构建状态
# {{ build.duration }} - 构建耗时
# {{ target.xxx }} - 目标相关变量
on_success: |
{
"channel_id": "{{ target.group_id }}",
"content": "🍯 HBW 构建完成\n状态: {{ build.status }}\n耗时: {{ build.duration }}"
}
# on_failure: 构建失败时发送的内容
on_failure: |
{
"channel_id": "{{ target.group_id }}",
"content": "🍯 HBW 构建失败!\n状态: {{ build.status }}\n耗时: {{ build.duration }}"
}
# on_finish_of: 在指定阶段完成时发送通知
# 可用于在构建过程中发送进度通知
# 阶段命名规则:
# - prebake/finalize: 第二字段为静态名称,如 "prebake.ready"
# - bake: 第二字段为 bake.sh 中的函数名,如 "bake.build"
# 每个条件有独立的 content,会在对应时机发送
on_finish_of:
stage: "prebake.ready"
content: |
{
"channel_id": "{{ target.group_id }}",
"content": "🍯 HBW 准备完毕\n状态: {{ build.status }}\n耗时: {{ build.duration }}"
}
# 次优先级组 - 备用通知方式(当优先级 0 中任一方式失败时触发)
1:
# 邮件通知(内置插件)
mail:
to: "user@gmail.com"
from:
host: "mail.163.com"
mode: "smtp"
# 加密模式:
# - "TLS": 使用 TLS 加密(端口 465
# - "StartTLS": 使用 STARTTLS(端口 587
# - "no": 不加密(不推荐)
secure: "TLS"
username: {{ variable.mail.user }}
password: {{ secret.mail.password }}
schema: "default"
# 插件也可以直接作为通知方式使用
# 需要插件支持通知触发器(on_success/on_failure/on_finish_of
sms-notify:
to: "+8610012345678"
schema: "custom"
policy:
- on_success: "[HBW Notify] Build Succeeded: {{ build.status }} ({{ build.duration }})"
to: "+8610012345678"
- on_failure: "[HBW Notify] Build Failed: {{ build.status }} ({{ build.duration }})"
to: "+8610012345679"
- on_finish_of:
stage: "bake.build"
content: "[HBW Notify] Build Progress: {{ build.status }} ({{ build.duration }})"
to: "+8610012345677"
fallible: true
# =============================================================================
# 制品定义
# =============================================================================
# 制品是构建产生的输出文件,可被存储、发布或清理
#
# 制品 ID
# - 可选,如未指定则由系统自动生成
# - 格式:MD5(PUID + PATH)
# - PUID: Pipeline Unique Identifier
#
# 制品路径:
# - 支持通配符,会被编译为正则表达式
# - 在配置加载时检查语法,在执行时编译和匹配
# - 总限制时间 1 秒(编译 + 匹配)
# - 一个路径匹配 = 一个制品元素
# - 空路径表示非文件系统制品(如 Docker 镜像)
#
# 制品传输:
# - 通过 hard-link/rsync 传输到插件工作空间
# - 插件可自定义传输方式
artifact:
# 示例制品 1:普通文件制品
- # 制品 ID,可选
# 如不指定,系统自动生成 MD5(PUID + PATH)
id: "<SOME_ARTIFACT_ID>"
# 制品路径,支持 glob 模式
# 匹配的每个文件/目录作为独立制品
path: "/workspace/target/release/*"
# 保留时长
# TODO
retention: "7d"
# 压缩方式:
# - "zstd": Zstandard 压缩(推荐)
# - "gzip": Gzip 压缩
# - "none": 不压缩
# - "dir": 保留为目录结构(用于需要完整目录树的场景)
compression: "zstd"
# 触发条件:
# - "success": 构建成功时处理
# - "failure": 构建失败时处理(WIP
# - "always": 总是处理(WIP
# 支持多个条件
on:
- success
# 示例制品 2:Docker 镜像制品
- id: "<ANOTHER_ARTIFACT_ID>"
# 空路径表示非文件系统制品
# 用于 Docker 镜像、远程制品等
# 此类制品的"内容"由 publish 定义
path: ""
retention: "5d"
compression: "none"
on:
- success
# 发布配置
# 制品可以发布到一个或多个目标
# 多个发布目标并行执行(除非受 Token 约束)
publish:
# 引用 plugin 部分定义的插件名称
docker-push:
# 覆盖/补充插件配置
# 镜像名称,包含 registry 地址
# 如 plugin 中已定义 host,此处可省略 registry 部分
image: "docker.io/user/image:tag"
# 同一制品可以发布到多个插件
# 通过 Token/Lock 机制协调访问
image-check:
image: "docker.io/user/image:tag"
# =============================================================================
# 钩子定义
# =============================================================================
# 在 finalize 阶段执行的前置/后置钩子
# 可用于清理、预处理、后处理等操作
#
# 执行时机:
# - early: 制品收集之前执行
# - late: 所有操作完成后执行
#
# 命令类型:
# - 普通命令:直接执行 shell 命令
# - 插件命令:以 "plugin:" 开头,调用已定义的插件
hooks:
# 早期钩子:在制品收集之前执行
early:
- # 钩子名称,用于日志和调试
name: "cleanup temp files before artifact collection"
# 执行命令
command: "rm **/.tmp"
# 工作目录
working_dir: "/workspace"
# 插件类型钩子示例
- name: "Early hook internal plugin"
command: "plugin:early-hook-internal"
# 超时时间(秒)
timeout: 600
# 后期钩子:在所有操作完成后执行
late:
- name: "Build completion notification"
command: "echo 'Build completed!'"
# =============================================================================
# 清理配置
# =============================================================================
# 清理策略控制构建完成后的资源回收
# WIP: 更多选项待设计
cleanup:
# 清理策略:
# - "auto": 自动清理(默认)
# - "manual": 手动清理
# - "on_failure": 仅失败时清理(WIP
policy: "manual"
# =============================================================================
# 模板变量参考
# =============================================================================
# finalize.yml 支持以下模板变量
#
# 用户配置:
# {{ variable.xxx }} - 用户在 Baker 中配置的值
#
# 密钥(来自 Vault):
# {{ secret.xxx }} - 从 Vault 获取的密钥值
# - 仅存在于内存中,不写入磁盘
# - 日志中自动遮蔽
# - 需要 PIPELINE_UNCOVER_SECRET 权限才能查看(需 2FA
#
# 构建信息:
# {{ build.status }} - 构建状态(动态,表示最后确认的状态)
# {{ build.duration }} - 构建耗时
# {{ build.stage }} - 当前/最后阶段
#
# 目标信息:
# {{ target.xxx }} - 目标相关变量
#
# 注意:
# - 变量可用性取决于执行阶段
# - 在 prebake.ready 阶段,build.duration 可能不可用
# - 使用不可用变量时行为 TBD
# =============================================================================
# 与 prebake.yml 和 bake.sh 的关系
# =============================================================================
# 完整的 HBW 流水线包含三个阶段:
#
# 1. prebake (prebake.yml)
# - 环境准备:Docker/Firecracker/Bare-metal
# - 依赖安装:系统包、语言包
# - 环境变量设置
# - 缓存配置
# - 输出:准备好的构建环境
#
# 2. bake (bake.sh)
# - 构建执行:编译、测试、打包
# - 通过 @decorator 控制执行流程
# - 输出:构建产物
#
# 3. finalize (finalize.yml)
# - 制品收集:收集构建产物
# - 制品发布:推送到目标位置
# - 通知发送:通知构建结果
# - 资源清理:回收临时资源
# - 输出:发布的制品、通知记录
#
# 数据流:
# prebake → bake → finalize
# 环境变量从 prebake 传递到 bake
# 制品从 bake 传递到 finalize
# Secret 在所有阶段可用(通过 {{ secret.xxx }}
# =============================================================================
# 示例:完整流水线配置
# =============================================================================
# 项目 .workshop 目录通常包含:
# - prebake.yml 或 prebake.yml.tmpl
# - bake.sh 或 bake.sh.tmpl
# - finalize.yml 或 finalize.yml.tmpl
# - .env 环境变量(不应包含 secret)
#
# 模板文件(.tmpl 后缀)包含占位符,会在首次运行时生成实际配置
# 系统会通过 LLM 或模板引擎填充这些占位符
# vim: set ft=yaml ts=2 sw=2 et: