
Zulip Harbor 集成指南将 Harbor 镜像仓库事件实时接入 Zulip 通知【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip本篇指南以 Zulip 仓库中 Harbor Webhook 集成的官方文档 zerver/webhooks/harbor/doc.md 为主体系统讲解如何将 Harbor 容器镜像仓库的推送、扫描完成等事件实时转发到 Zulip 会话。读完本文你将掌握完整的配置步骤、Harbor 支持的事件类型与 Zulip 侧的消息渲染逻辑并能结合仓库源码理解其底层实现与测试验证方式实现可复现、可排障的镜像仓库监控方案。Harbor 集成概述Zulip 官方提供了 Harbor 的 Webhook 集成用于将 Harbor 镜像仓库中的关键操作镜像推送、漏洞扫描完成等以结构化消息的形式发送到 Zulip 的指定会话中让团队在不切换工具的情况下实时感知镜像仓库的动态适用于 CI/CD 流水线监控、镜像安全治理等场景。需要特别说明的版本前提是Harbor 的 Webhook 功能自 Harbor 1.9 版本起才可用因此使用本集成前请确认你的 Harbor 实例版本不低于 1.9。从源码结构看该集成的完整实现位于仓库 zerver/webhooks/harbor/ 目录包含四类文件文件作用doc.md面向用户的集成配置文档即本文主体view.pyWebhook 请求的接收、解析与消息构造逻辑tests.py基于 WebhookTestCase 的端到端测试fixtures/用于测试的 Harbor 原始 Webhook JSON 负载在 Zulip 侧准备接收端创建 Incoming Webhook BotHarbor 事件要进入 Zulip第一步是在 Zulip 中创建一个专用机器人。请按以下步骤操作进入 Zulip 的设置页面选择添加机器人或集成Add a bot or integration入口为 Harbor 集成创建一个新机器人创建时务必在Bot type机器人类型中选择Incoming webhook只有该类型的机器人才能接收第三方服务的 Webhook 回调并写入会话创建完成后Zulip 会为该机器人生成专属 API 密钥后续生成的 Webhook URL 会依赖此密钥完成鉴权。上述步骤对应文档模板 templates/zerver/integrations/include/create-an-incoming-webhook.md这是 Zulip 全部 Webhook 集成共用的前置步骤。生成 Harbor 集成 Webhook URL创建好 Incoming webhook 机器人后需要确定 Harbor 通知将要发送到的目标会话流并生成集成的专属 URL决定将 Harbor 通知发送到哪个流Stream与主题Topic在 Zulip 的帮助中心按照生成集成 URLGenerate integration URL流程得到形如https://your-zulip-domain.zulipchat.com/api/v1/external/harbor?api_key机器人密钥stream目标流topic自定义主题的端点地址。该步骤对应文档模板 templates/zerver/integrations/include/generate-webhook-url-basic.md。URL 中的查询参数是可选的若省略stream消息默认发送到机器人所属的默认流若省略topic则使用集成根据事件负载自动推导的主题名详见下文主题的生成规则。Webhook URL 的完整格式规范路径、鉴权参数、stream/topic 参数的解析方式在 templates/zerver/integrations/include/webhooks-url-specification.md 中描述Zulip 侧通过webhook_view装饰器与check_send_webhook_message统一完成鉴权与参数解析见 zerver/lib/webhooks/common.py。在 Harbor 中配置 Webhook 端点Zulip 侧准备就绪后回到 Harbor 管理界面完成最后一公里配置进入 Harbor 的Projects项目页面打开目标项目点击顶部导航中的Webhooks标签页在 Webhook 配置表单中将Endpoint URL端点地址设置为上一步生成的 Zulip 集成 URL点击Continue继续保存配置。保存后Harbor 会在指定事件发生时向该端点推送 JSON 负载Zulip 的 Harbor 集成即开始工作。配置完成后你的 Harbor 通知消息效果如下图所示截图来自官方文档路径为static/images/integrations/harbor/001.png推送镜像与扫描完成事件会以带格式的文本消息出现在指定流中。至此你已完成全部配置工作——文档中对应congrats模板templates/zerver/integrations/include/congrats.md所描述的即是该状态。Harbor 事件类型与 Zulip 消息渲染虽然文档正文没有逐一列出 Harbor 支持的事件但从集成源码 zerver/webhooks/harbor/view.py 中可以确认其完整的事件处理矩阵。Harbor 的 Webhook 负载包含顶层type字段Zulip 集成依据该字段分派事件已支持的事件生成通知消息EVENT_FUNCTION_MAPPERview.py注册了两种会被渲染成消息的事件事件类型触发时机消息模板PUSH_ARTIFACT镜像artifact被推送到仓库**{operator}** pushed image \{image_id}.SCANNING_COMPLETED镜像漏洞扫描完成Image scan completed for \{image_id}. Vulnerabilities by severity: ...其中image_id的构造规则view.py为优先使用仓库全名:tag如example/test:latest若负载中资源没有tag字段例如基于 digest 的引用则退化为仓库全名digest如test/alpine/helmsha256:b503...。被忽略的事件静默丢弃IGNORED_EVENTSview.py定义了集成选择忽略、不发送任何消息的六种事件DOWNLOAD_CHART下载 Helm ChartDELETE_CHART删除 Helm ChartUPLOAD_CHART上传 Helm ChartPULL_ARTIFACT拉取镜像DELETE_ARTIFACT删除镜像SCANNING_FAILED扫描失败这些事件要么过于高频如拉取镜像不适合进入团队会话要么信息价值有限。测试用例 tests.py 专门验证了DELETE_ARTIFACT事件被忽略请求返回成功但check_send_webhook_message未被调用。未知事件的处理若收到不在IGNORED_EVENTS中、也未注册在EVENT_FUNCTION_MAPPER中的事件类型集成会抛出UnsupportedWebhookEventTypeErrorview.py该异常由 Zulip 的 Webhook 错误处理机制统一转换为可见的错误提示便于排障。操作者识别把 Harbor 用户映射为 Zulip 用户为提升消息可读性集成会对推送镜像的操作者operator字段做智能识别view.py当operator为auto如扫描完成事件触发方是 Harbor 系统而非用户时消息中不显示操作者否则通过guess_zulip_user_from_harborview.py在当前 realm 内查找匹配的活跃用户匹配规则Zulip 用户全名与 Harbor 用户名不区分大小写完全一致或 Zulip 邮箱以 Harbor 用户名为前缀匹配成功消息中以**全名**的形式 提及该 Zulip 用户可直接被 提醒匹配失败退化为**Harbor用户名**的加粗文本展示。这一设计让镜像推送通知天然具备谁推了镜像的上下文且能与 Zulip 的 提及和通知体系联动。消息内容与主题生成规则主题Topic的生成集成以负载中event_data.repository.repo_full_name字段即命名空间/仓库名如example/test作为消息主题view.py。这意味着同一仓库的事件会自动聚合到同一主题下不同仓库自然分区符合 Zulip 主题化讨论的设计理念。测试用例中的预期主题example/test、test/alpine/helm均与之一致。推送镜像消息当事件为PUSH_ARTIFACT时消息格式取决于操作者是否可识别识别出操作者**admin** pushed image \example/test:latest.操作者为auto或未识别Image \example/test:latest was pushed.。对应模板常量见 view.py。扫描完成消息当事件为SCANNING_COMPLETED时集成从负载的scan_overview中解析漏洞报告MIME 类型application/vnd.security.vulnerability.report; version1.1按严重级别逐行输出漏洞计数view.py典型渲染结果Image scan completed for test/alpine/helm:3.8.1. Vulnerabilities by severity: * High: **4** * Unknown: **1**若扫描摘要为空无漏洞则输出None占位若负载缺少 1.1 版本的漏洞报告类型集成会抛出UnsupportedWebhookEventTypeError从源码结构看这是为了保证渲染的漏洞统计准确、可靠。事件过滤按需收窄通知范围Harbor 集成支持 Zulip 的通用事件过滤能力。在生成的集成 URL 中追加only_events或exclude_events查询参数值为事件类型列表可用 Unix shell 风格通配符即可只接收或排除指定事件。本集成可过滤的事件集合为PUSH_ARTIFACTSCANNING_COMPLETED例如若只关心安全扫描结果可在 URL 中配置only_events[SCANNING_COMPLETED]则镜像推送通知将被过滤掉。过滤机制的底层实现在 zerver/lib/webhooks/common.pycheck_send_webhook_message收到事件类型后会先用fnmatch与only_events/exclude_events逐项匹配不满足条件时直接返回、不发消息。官方文档说明见 templates/zerver/integrations/include/event-filtering-additional-feature.md。事件负载结构以仓库 fixtures 为例理解集成对负载的解析可以直接参考 zerver/webhooks/harbor/fixtures/ 下的真实 JSON 样例push_image.jsonPUSH_ARTIFACT事件operator为admin资源带tag: latest仓库为example/testscanning_completed.jsonSCANNING_COMPLETED事件operator为autoscan_overview中 Trivy 扫描器报告High: 4、Unknown: 1的漏洞统计scanning_completed_no_tag.json无tag字段、以digest标识镜像的扫描完成事件scanning_completed_no_vulnerability.json扫描完成但无漏洞的事件delete_image.jsonDELETE_ARTIFACT事件用于验证忽略逻辑。这些 fixtures 同时揭示了 Harbor Webhook 负载的核心字段结构顶层type事件类型、operator触发者、occur_at触发时间戳以及event_data.repository.repo_full_name、event_data.resources[0].tag/digest、scan_overview等事件详情字段。若你在配置后未收到通知可先对照这些样例检查 Harbor 实际推送的负载结构是否与之一致。测试验证集成行为的可复现保障该集成的行为由 zerver/webhooks/harbor/tests.py 中的HarborHookTests用例保障测试直接复用了上述 fixtures测试用例验证内容test_push_image推送事件渲染为**admin** pushed image \example/test:latest.主题为example/testtest_delete_image_ignored删除事件被忽略不发送任何消息test_scanning_completed扫描完成事件按严重级别输出漏洞统计test_scanning_completed_no_vulnerability无漏洞时输出Nonetest_scanning_completed_no_tag无 tag 时以 digest 形式标识镜像所有用例继承 Zulip 的WebhookTestCase定义于 zerver/lib/test_classes.py以完整请求-响应闭环模拟 Harbor 的真实回调。这组测试既是集成质量的保障也为你在自建环境中排查事件未到达/未渲染问题提供了可对照的预期输出基线。小结与排障建议总结本集成的完整使用链路在 Zulip 创建 Incoming webhook 机器人 → 生成集成 URL → 在 Harbor 项目的 Webhooks 页面配置 Endpoint URL → Harbor 1.9 在推送镜像、扫描完成等事件发生时回调 Zulip → Zulip 按事件类型渲染消息并投递到指定流与主题。遇到问题时可按以下顺序排查确认 Harbor 版本 ≥ 1.9且 Webhook 配置已保存成功用 curl 手动向集成 URL 发送 push_image.json 格式的负载验证 URL 与鉴权是否正确对照 scanning_completed.json 检查真实负载的字段结构尤其type、event_data.resources与scan_overview检查是否配置了only_events/exclude_events过滤导致事件被静默丢弃确认该事件是否属于IGNORED_EVENTS如PULL_ARTIFACT、DELETE_ARTIFACT——这些事件设计上不会产生通知。关于 Webhook URL 的通用格式规范与事件过滤参数细节可进一步阅读 templates/zerver/integrations/include/webhooks-url-specification.md若希望为 Harbor 补充新的支持事件集成入口与消息模板均集中在 zerver/webhooks/harbor/view.py测试与 fixtures 位于同目录可参照现有模式扩展。【免费下载链接】zulipZulip server and web application. Open-source team chat that helps teams stay productive and focused.项目地址: https://gitcode.com/GitHub_Trending/zu/zulip创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考