argocd-notifications-controller)推送变更:本集成提供一段 argocd-notifications-cm 配置,包含一个 Webhook 服务、一个请求体模板和一个触发器。Argo CD 应用(Application)的每一次同步(Sync)操作对应一条 Flashduty 变更,同步开始时记录为 Processing,结束时更新为 Done、Failed 或 Canceled。
自动同步、在界面或 CLI 中手动同步、回滚(Rollback)都是同步操作,都会记录。应用的同步失败、健康降级告警请使用 Argo CD 告警集成,两者可以同时配置。
在 Flashduty On-call
- 进入 Flashduty 控制台,选择 集成中心 → 变更事件
- 选择 Argo CD,填写集成名称
- 如需把变更分派到指定协作空间,在集成的 路由 中按标签(例如
application、project、destination_namespace)配置规则 - 点击 保存,复制生成的 推送地址
在 Argo CD 中配置
以下操作需要能修改 Argo CD 所在命名空间(默认
argocd)中 ConfigMap 的 Kubernetes 权限,以及修改 Application 或 AppProject 注解的权限。Argo CD 集群需要能访问推送地址所在的域名。
1
写入 Webhook 服务、模板和触发器
把下面的内容保存为 合并到现有的 如果 Argo CD 通过 Helm Chart 安装,请把
flashduty-change.yaml,将 url 替换为上一步复制的推送地址(包含 ?integration_key=...):argocd-notifications-cm(--type merge 只增改上面这些键,不影响已有配置):service.webhook.flashduty-change 写到 notifications.notifiers,模板写到 notifications.templates,触发器写到 notifications.triggers,否则下次升级会覆盖手动修改。配置说明:- 模板中的每个值都经过
toJson转义,同步信息中的引号和换行不会破坏 JSON,请不要去掉。字段名不要修改,app_uid、phase和started_at必须保留 - 可选字段通过
dig读取,应用从未同步过、同步尚未产生结果时模板也能正常渲染 - 触发器的两个条件分别对应同步开始和同步结束。
oncePer取同步操作的开始时间,保证每一次同步操作的开始和结束各发送一次,即使连续两次同步之间 Argo CD 没有观察到中间状态,请不要去掉 - 服务名
flashduty-change与告警集成使用的flashduty不同,两个集成的推送地址互不影响 argocd_url取自argocd-notifications-cm的context.argocdUrl,用于生成变更链接;未配置时变更没有链接,不影响记录
2
订阅通知
触发器需要被订阅后才会发送。按需要的范围选择一种方式:
-
单个应用:在 Application 上添加注解
-
一个项目下的所有应用:在 AppProject 的
metadata.annotations中添加同样的注解notifications.argoproj.io/subscribe.on-flashduty-change.flashduty-change: "" -
所有应用:在
argocd-notifications-cm的subscriptions中添加一项。如果已有subscriptions(例如告警集成添加的那一项),请在原列表中追加,不要用上一步的 merge 命令整体覆盖
3
验证连通性
Argo CD 没有发送测试消息的按钮。可以在 命令会打印请求和响应的调试日志,其中包含完整的推送地址(含
argocd-notifications-controller Pod 中用 argocd admin notifications template notify 按应用当前状态发送一次通知:integration_key),请不要把输出贴到公开位置。输出中 Received response: 一行的状态为 200 OK 即表示 Flashduty 已接受请求。应用同步过时,这条通知就是最近一次同步的结果,与该次同步已有的记录合并,不会新增变更;应用从未同步过时,Flashduty 直接忽略。4
验证同步记录
同步一个已订阅的应用(在界面点击 Sync,或执行
argocd app sync <应用名>),确认 Flashduty 的变更列表中出现一条 Processing 的变更,同步结束后更新为 Done 或 Failed。一条变更是什么
一条变更对应一个应用的一次同步操作,变更标识(change_key)为
<app_uid>/<started_at>:
app_uid是应用的metadata.uid。Kubernetes 为每个对象分配的 UID 在集群的整个生命周期内唯一,不同 Argo CD 实例中同名的应用、删除后重建的应用都是不同的应用started_at是同步操作的开始时间(status.operationState.startedAt,按 UTC 记录)。Argo CD 在同步开始时写入这个时间,重试期间保持不变,一个应用同一时刻只运行一个同步操作
app_uid 或 started_at,或者时间不是 RFC 3339 格式时,Flashduty 会拒绝该请求。
状态映射
Done、Failed 和 Canceled 是结束状态,Flashduty 会记录变更结束时间。因同步超时被 Argo CD 终止的操作(信息包含
triggered by controller sync timeout)记为 Failed。
同步阶段区分大小写,其他值会被拒绝。以下推送返回成功但不生成变更:应用还没有同步操作(phase 为空)、试运行(Dry Run)同步。
同步开始时记录的时间是 started_at,结束时是 finished_at。Argo CD 失败后自动重试期间,同步阶段保持 Running,不会提前记为 Failed。
变更内容
- 标题:
<应用名>: sync <版本> to <目标命名空间>。版本为 Git 提交时显示前 7 位,Helm Chart 版本等其他值原样显示;没有版本或目标命名空间时省略对应部分 - 链接:
<argocdUrl>/applications/<应用名>,配置了context.argocdUrl时才有
值为空的字段不会写入标签。
常见问题
为什么没有收到变更?
为什么没有收到变更?
- 查看
argocd-notifications-controller的日志(kubectl logs -n argocd deploy/argocd-notifications-controller),确认应用上有notifications.argoproj.io/subscribe.on-flashduty-change.flashduty-change注解,或subscriptions中包含on-flashduty-change - 日志中出现
template 'flashduty-change' is not supported或trigger 'on-flashduty-change' is not configured时,确认配置已写入argocd-notifications-cm,Helm 安装请检查对应的 values
只收到了同步结束,没有收到同步开始?
只收到了同步结束,没有收到同步开始?
同步在几秒内完成时,Argo CD 可能没有观察到
Running 阶段,只发送结束通知。Flashduty 会直接按结束状态记录这条变更。重复发送同一条通知会重复记录吗?
重复发送同一条通知会重复记录吗?
不会。同一阶段、同一时间的事件只记录一次。
日志中出现 failed with error code 400?
日志中出现 failed with error code 400?
确认模板与本文一致,所有值都经过
toJson。响应内容会指出缺少或不支持的字段,例如 app_uid is missing、started_at is missing、unsupported phase。