使用模板自定义 Task 概览
本指南介绍如何使用 ConfigMap-backed 模板 在 TaskRuns 和 PipelineRuns 的 概览 选项卡中渲染富 HTML 报告。
与其将完整的 HTML 或 Markdown 报告写入单个 Task result,不如让 Tasks 生成 少量结构化指标,然后由 UI 使用来自 ConfigMap 的模板来渲染最终概览。
在以下场景中使用本指南:
- 你希望为
Task提供一个 一致、精美的概览(例如代码扫描摘要)。 - 你的 Markdown 概览已经 接近或超过
Taskresult 的有效大小限制。 - 你希望在多个
Tasks或集群之间 复用 相同的布局。
模板渲染是
overview-markdownresult 的一种 替代方案。如果某个Task仍然输出名为overview-markdown的 result,UI 将 优先使用该 Markdown,并跳过模板渲染。
目录
前提条件工作原理步骤1. 在 Markdown 和模板之间进行选择2. 创建模板 ConfigMap3. 为你的 Task 添加一个 result4. 使用注解将 Task 绑定到模板5. 运行 Task 并检查概览选项卡提示与约定故障排查概览选项卡中没有任何内容模板已渲染,但数据为空或错误result 大小或 termination message 限制选中了错误的模板前提条件
- 集群中已安装 Tekton Pipelines。
- 具有在共享模板命名空间
kube-public中创建 ConfigMaps 的权限。
工作原理
- 你的
Task输出一个或多个包含指标或摘要数据的 results。 - 你的
Task元数据包含 annotations,用于告知 UI:- 应使用哪个 ConfigMap 作为模板(通过 label selector)。
- 应读取哪些
Taskresults 并传递给模板。
- UI:
- 检查
TaskRun是否具有名为overview-markdown的 result。如果有,则渲染该 Markdown 并 停止。 - 否则,从
TaskRun中读取模板 annotations。 - 查找匹配的 ConfigMap 并加载
template.ejs。 - 读取
TaskRun中声明的 results,并将它们合并为单个 JSON payload。 - 使用该 payload 计算 EJS 模板,并在 概览 选项卡中渲染生成的 HTML。
- 检查
步骤
1. 在 Markdown 和模板之间进行选择
在以下情况下使用 overview-markdown result:
- 内容较短,并且容易保持在 result 大小限制以内。
- 你只需要非常简单的格式化。
在以下情况下使用模板 ConfigMap:
- 你需要更复杂的布局(列、徽章、进度条等)。
- 你已经有结构化指标,并希望展示得更美观。
- 你希望多个
Tasks共享同一种概览布局。
如果同时配置了两种方式,
overview-markdown会优先生效。你只需不要向overview-markdownresult 写入任何内容,即可查看模板输出。
2. 创建模板 ConfigMap
创建一个包含你的 EJS 模板以及用于标识其所属 Task 的 labels 的 ConfigMap。
EJS 是一种简单的模板语言,可让你使用纯 JavaScript 生成 HTML 标记。 无需拘泥于如何组织内容。也不用重新发明迭代和控制流。它就是纯 JavaScript。 有关更多详细信息,请参阅:
示例:
要点:
- 模板文件名始终是
template.ejs。 - UI 会将来自 results 的变量注入模板。
- 你可以使用常规的 EJS 语法(
<% %>、<%= %>)来实现简单逻辑和格式化。
3. 为你的 Task 添加一个 result
在 Task 中定义一个 result,用于携带模板使用的指标。
Task 示例:
指南:
- 保持 result 小而扁平。使用计数、百分比、状态和 URL 等简单字段。
- 不要嵌入大量文本块。
- 如果使用 object result,请确保 step 写入的是 有效 JSON(无尾随逗号、引号正确)。
4. 使用注解将 Task 绑定到模板
在 Task 上使用 annotations,告诉 UI 应使用哪个模板,以及应传入哪些 results。
单 result 示例:
从概念上讲,UI 将构造如下 payload:
然后,它会使用该 payload 计算 template.ejs,这样你就可以使用 metrics.total、metrics.status 等字段。
你可以将多个 Task results 合并为一次模板渲染。这在以下场景中很有用:
- 一个 result 存放指标。
- 另一个 result 存放完整报告的 URL。
示例:
UI 将构建类似如下的 payload:
5. 运行 Task 并检查概览选项卡
-
将
ConfigMap和Task应用到集群中。 -
创建一个使用该
Task的TaskRun或PipelineRun,例如: -
等待运行完成。
-
在 UI 中打开该运行,并选择 概览 选项卡。
如果一切配置正确,你应该能够看到模板生成的 HTML。
如果
Task还输出了overview-markdown,则会显示 Markdown,而不是模板。
提示与约定
- 优先使用较小的 metrics result。 将 results 视为紧凑摘要。
- 保持模板逻辑简单。 重点放在展示上,而不是业务逻辑上。避免在模板中进行大量计算。
- 防御性地处理缺失数据。 在模板中使用默认值,以免缺少字段导致渲染失败。
故障排查
概览选项卡中没有任何内容
Task是否输出了空的overview-markdown?- 如果是,UI 会显示该空 Markdown,并忽略模板。你只需不要向
overview-markdownresult 写入任何内容,即可查看模板输出。
- 如果是,UI 会显示该空 Markdown,并忽略模板。你只需不要向
TaskRun是否包含overview-template-result-key中列出的 result(s)?- 检查
TaskRunYAML,并查看.status.results。
- 检查
overview-template-selector中的 selector 是否在kube-public命名空间中恰好匹配一个ConfigMap?- 使用
kubectl get configmap -l <your-selector> -n kube-public进行测试。
- 使用
模板已渲染,但数据为空或错误
- 如果你使用的是 object result,请确认该 result 是有效的,并且包含模板期望的字段。
- 检查
overview-template-result-key的名称是否与Taskresult 名称完全一致。
result 大小或 termination message 限制
- 从 results 中移除非必要字段。
- 将按文件的详细报告推送到日志或外部系统,只在 result 中包含摘要数字和 URL。
- 请记住,每个
Task在所有 steps 和 results 之间仍然共享同一个 termination-message 配额。
选中了错误的模板
- 确保
overview-template-selector足够具体(例如同时包含Task名称和版本)。 - 避免对无关模板重复使用相同的 labels。
- 如果有多个
ConfigMaps匹配该 selector,请进一步收紧 labels,确保只选中一个ConfigMap。
一旦你具备了 模板 ConfigMap、metric results 和正确的 Task annotations,就可以在不修改 UI 本身的情况下,构建可复用、可版本化的 Task 概览布局。