{# Executions card. Replaces the old "Live VMs" table: one row per recent Gitea Actions run (the live ones included), with the build VM(s) that run spawned grouped into its VM cell, Remove action and all. Degraded states (no token, expired token, Gitea unreachable) render a notice and still list every running VM below, so this card is never less useful than the VM table it replaces. Orphan VMs are NOT handled here: the sweep lives in the Maintenance card and the count in the status-header VMs tile; ``executions.unmatched_vms`` only exists so a powered-on VM whose run has scrolled out of the window (or that no run ever claimed) keeps its row and its Remove button. The row-count selector re-fetches the card with ``?limit=N``, and the card it renders carries that same limit on its own polling URL -- that is what makes the choice survive the 5s refresh without any client-side state. #}

Executions

newest first
{% if not backend_available %} {% endif %} {% if executions.error %} {% endif %} {% if executions.runs or executions.unmatched_vms %}
{% for run in executions.runs %} {% endfor %} {% for vm in executions.unmatched_vms %} {% set parsed = vm.name | clone_job %} {% endfor %}
Run Workflow Branch / commit Trigger Status Duration VM Actions
{% if run.html_url %} #{{ run.number }}{% if run.attempt > 1 %}.{{ run.attempt }}{% endif %} {% else %} #{{ run.number }}{% if run.attempt > 1 %}.{{ run.attempt }}{% endif %} {% endif %} {% if run.repo %}
{{ run.repo }}{% endif %}
{{ run.workflow or "—" }} {{ run.branch or "—" }} {% if run.commit %}
{{ run.commit[:7] }}{% endif %}
{{ run.event or "—" }} {% if run.actor %}
{{ run.actor }}{% endif %}
{{ run.status }} {{ run.duration_sec | duration }} {% if run.started %}
{{ run.started | relative_time }}{% endif %}
{% for vm in run.vms %}
{{ vm.name }}
{{ vm.ip or "no ip" }} · up {{ vm.uptime_sec | duration }}
{% else %} — {% endfor %}
{% for vm in run.vms %}
{% endfor %}
{{ parsed.job_id or "no run" }} — — — {% if vm.is_orphan %} orphan {% else %} running {% endif %} {% if parsed.started %} {{ parsed.started | relative_time }} {% else %} — {% endif %} {{ vm.name }}
{{ vm.ip or "no ip" }} · up {{ vm.uptime_sec | duration }}
{% else %}

No recent executions{% if not executions.error %} and no VMs running{% endif %}.

{% endif %}