0dd4a157ef
hook execution - Add FinalizeHooks config for early/late stage hook execution - Support plugin: prefixed commands in hooks to invoke registered plugins - Implement standalone mode that auto-downloads plugins before registration - Add shallow clone and checksum options to plugin config - Normalize retention format to lowercase in template - Refactor PathBuf to Path in plugin fetch modules for consistency
364 lines
13 KiB
Cheetah
364 lines
13 KiB
Cheetah
# 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"
|
||
on_success: "[HBW Notify] Build Succeeded: {{ build.status }} ({{ build.duration }})"
|
||
on_failure: "[HBW Notify] Build Failed: {{ build.status }} ({{ build.duration }})"
|
||
on_finish_of:
|
||
stage: "bake.build"
|
||
content: "[HBW Notify] Build Progress: {{ build.status }} ({{ build.duration }})"
|
||
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:
|