{% import "macros.html" as m %}
CI single-flight holds when the Woodpecker pipeline runs a test through the warden (testctl run --origin ci) — it joins the same lease, so a CI run and a local run of the same test can’t collide. Triggering a pipeline needs the warden-reachable CI host plus a trigger token, which this read-mostly console does not hold; start one from the CLI (testctl ci start). “Watch” deep-links into Woodpecker.
Watch in Woodpecker
{% if data.ci_repo_url %}

This project’s CI on the Woodpecker host:

{{ data.ci_repo_url }}

Per-pipeline links (…/pipeline/<id>) need a pipeline id the run-record doesn’t yet carry — that arrives with testctl ci start + a CI-run store (spec §4.6).

{% else %} {{ m.empty('⚙', 'CI host not linked', 'Add a [ci] section to fed-resources/source/project.toml (host defaults to ' ~ data.woodpecker ~ ', repo = the Woodpecker repo id) to deep-link Watch into this project’s pipelines.') }} {% endif %}
Recent CI runsCI runs that joined the lease — run-records with origin ci
{% if not data.ci_runs %} {{ m.empty('∅', 'No CI runs yet', 'When a Woodpecker pipeline runs a test through the warden (--from-ci) it joins the lease and appears here with a Watch link.') }} {% else %}
{% for c in data.ci_runs %}
{{ m.status_chip(c.outcome) }}
{{ c.test_id }}
{{ c.run_id }} · {{ c.started_hhmmss }}
joined lease {% if data.ci_repo_url %}Watch ↗{% endif %}
{% endfor %}
{% endif %}