47 lines
1.7 KiB
YAML
47 lines
1.7 KiB
YAML
id: image-drift
|
|
name: "GHCR image drift vs showcase/ or examples/integrations/ HEAD"
|
|
owner: "@oss"
|
|
|
|
signal:
|
|
dimension: image_drift
|
|
|
|
triggers:
|
|
# set_changed catches stale-set transitions (services newly out of date).
|
|
# set_errored catches the pure-error case: a service flips stale→errored
|
|
# without changing the stale set, so set_changed stays false but the
|
|
# template's {{signal.errored.length}} would silently render 0 without
|
|
# firing. deriveSignalFlags emits set_errored when signal.errored is
|
|
# non-empty; StringTriggerEnum accepts it (rules/schema.ts R5 C4).
|
|
- set_changed
|
|
- set_errored
|
|
|
|
conditions:
|
|
guards:
|
|
- minDeployAgeMin: 20
|
|
|
|
actions:
|
|
- kind: rebuild
|
|
target: railway_redeploy
|
|
forEach: "{{signal.staleServices}}"
|
|
|
|
targets:
|
|
- kind: slack_webhook
|
|
webhook: oss_alerts
|
|
|
|
# Template only references fields the ImageDriftSignal probe actually
|
|
# emits. The `rebuildFailures` branch (present in an earlier revision)
|
|
# was dead code — the probe never sets that field, so the {{#...}}
|
|
# section never rendered. Removed to prevent another reviewer from
|
|
# trusting dead UI.
|
|
#
|
|
# Split text reflects F6.6: triggeredCount historically summed stale +
|
|
# errored, but `forEach` only redeploys stale. Render both counts
|
|
# distinctly so the Slack message matches what actions took place.
|
|
# Coordination with cluster 4: probe should keep emitting
|
|
# `staleCount` and `erroredCount` (or the template needs updating to
|
|
# derive them from the arrays). Template below falls back to array
|
|
# lengths via mustache `.length` for robustness.
|
|
template:
|
|
text: |
|
|
:package: *Image drift detected* — {{signal.staleServices.length}} {{signal.rebuildNoun}} triggered, {{signal.errored.length}} errored (<{{{event.runUrl}}}|run>)
|