Show author info
All checks were successful
Tests / Declarative: Post Actions passed: 14
CI-Multi/pipeline/pr-main This commit looks good

This commit is contained in:
2026-02-22 13:38:30 +01:00
parent 9297bed50e
commit f2da39f0db
4 changed files with 128 additions and 12 deletions

View File

@@ -16,7 +16,8 @@
import base64 import base64
import html import html
from typing import Dict, List import re
from typing import Dict, List, Tuple
import requests import requests
@@ -50,9 +51,36 @@ def _extract_trigger(build: Dict) -> str:
return "" return ""
def _summarize_trigger(trigger: str) -> Tuple[str, str, str]:
if not trigger:
return "", "", ""
pr_url = ""
for line in trigger.splitlines():
if line.strip().lower().startswith("reviewed-on:"):
pr_url = line.split(":", 1)[-1].strip()
break
author_match = re.search(r"\(([^)]+)\)\.", trigger)
author = author_match.group(1).strip() if author_match else ""
pr_match = re.search(r"#(\d+)", trigger)
title_match = re.search(r"Merge pull request '([^']+)'", trigger)
if pr_match:
pr_number = pr_match.group(1)
title = title_match.group(1).strip() if title_match else ""
if title:
return f"Merge PR #{pr_number} · {title}", pr_url, author
return f"Merge PR #{pr_number}", pr_url, author
return trigger.splitlines()[0].strip(), pr_url, author
def normalize_build(build: Dict) -> Dict: def normalize_build(build: Dict) -> Dict:
commits = _extract_commits(build) commits = _extract_commits(build)
trigger = _extract_trigger(build) trigger = _extract_trigger(build)
trigger_label, trigger_url, trigger_author = _summarize_trigger(trigger)
status = (build.get("result") or "RUNNING").lower() status = (build.get("result") or "RUNNING").lower()
if build.get("building"): if build.get("building"):
status = "running" status = "running"
@@ -65,6 +93,9 @@ def normalize_build(build: Dict) -> Dict:
"url": build.get("url"), "url": build.get("url"),
"commits": commits, "commits": commits,
"trigger": trigger, "trigger": trigger,
"trigger_label": trigger_label,
"trigger_url": trigger_url,
"trigger_author": trigger_author,
} }

View File

@@ -112,6 +112,9 @@ def test_build_history(monkeypatch):
{"commit": "9ac3f91", "message": "Anade la API de Jenkins", "author": "Dev One"} {"commit": "9ac3f91", "message": "Anade la API de Jenkins", "author": "Dev One"}
] ]
assert first["trigger"] == "Triggered by Merge pull request #37" assert first["trigger"] == "Triggered by Merge pull request #37"
assert first["trigger_label"] == "Merge PR #37"
assert first["trigger_url"] == ""
assert first["trigger_author"] == ""
second = builds[1] second = builds[1]
assert second["number"] == 204 assert second["number"] == 204
@@ -119,6 +122,9 @@ def test_build_history(monkeypatch):
assert second["duration_seconds"] == 1 assert second["duration_seconds"] == 1
assert second["commits"] == [] assert second["commits"] == []
assert second["trigger"] == "" assert second["trigger"] == ""
assert second["trigger_label"] == ""
assert second["trigger_url"] == ""
assert second["trigger_author"] == ""
def test_build_history_error_returns_empty(monkeypatch): def test_build_history_error_returns_empty(monkeypatch):

View File

@@ -377,14 +377,25 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
<span class={`status-dot ${build.status}`}></span> <span class={`status-dot ${build.status}`}></span>
<span class="summary-title">#{build.number}</span> <span class="summary-title">#{build.number}</span>
{#if build.commits.length === 0} {#if build.trigger_label || build.trigger}
<span class="muted"> <div class="summary-trigger">
{build.trigger || 'Ejecución manual'} {#if build.trigger_url}
</span> <a href={build.trigger_url} target="_blank" rel="noreferrer">
{:else} {build.trigger_label || build.trigger}
</a>
{:else}
<span>{build.trigger_label || build.trigger}</span>
{/if}
{#if build.trigger_author}
<span class="trigger-author">{build.trigger_author}</span>
{/if}
</div>
{:else if build.commits.length > 0}
<span class="summary-commit"> <span class="summary-commit">
{build.commits[0].commit} · {build.commits[0].author} {build.commits[0].commit} · {build.commits[0].author}
</span> </span>
{:else}
<span class="muted">Ejecución manual</span>
{/if} {/if}
</div> </div>
@@ -396,17 +407,39 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
</summary> </summary>
<div class="history-body"> <div class="history-body">
{#if build.commits.length > 0} {#if build.trigger_label || build.trigger}
<p class="history-row"> <p class="history-row">
<span>Mensaje</span> <span>Disparo</span>
<span>{build.commits[0].message}</span> <span>
{#if build.trigger_url}
<a
class="history-link"
href={build.trigger_url}
target="_blank"
rel="noreferrer"
>
{build.trigger_label || build.trigger}
</a>
{:else}
{build.trigger_label || build.trigger}
{/if}
{#if build.trigger_author}
<span class="trigger-author">{build.trigger_author}</span>
{/if}
</span>
</p> </p>
{/if} {/if}
{#if build.trigger} {#if build.commits.length > 0}
<p class="history-row"> <p class="history-row">
<span>Disparo</span> <span>Commit</span>
<span>{build.trigger}</span> <span class="mono">
{build.commits[0].commit} · {build.commits[0].author}
</span>
</p>
<p class="history-row">
<span>Mensaje</span>
<span>{build.commits[0].message}</span>
</p> </p>
{/if} {/if}

View File

@@ -697,6 +697,25 @@ li {
font-size: 0.95rem; font-size: 0.95rem;
} }
.summary-trigger {
display: flex;
align-items: center;
gap: 0.4rem;
flex-wrap: wrap;
color: #fbbf24;
font-weight: 700;
font-size: 0.95rem;
}
.summary-trigger a {
color: inherit;
text-decoration: none;
}
.summary-trigger a:hover {
text-decoration: underline;
}
.summary-meta { .summary-meta {
display: flex; display: flex;
gap: 0.6rem; gap: 0.6rem;
@@ -748,6 +767,21 @@ li {
color: #cbd5f5; color: #cbd5f5;
} }
.history-link {
color: #fbbf24;
text-decoration: none;
font-weight: 700;
}
.history-link:hover {
text-decoration: underline;
}
.muted {
color: #94a3b8;
font-size: 0.95rem;
}
.history-message { .history-message {
margin: 0.2rem 0 0; margin: 0.2rem 0 0;
background: rgba(248, 113, 113, 0.12); background: rgba(248, 113, 113, 0.12);
@@ -835,3 +869,15 @@ li {
font-size: 0.8rem; font-size: 0.8rem;
opacity: 0.85; opacity: 0.85;
} }
.trigger-author {
padding: 0.1rem 0.4rem;
border-radius: 999px;
background: rgba(148, 163, 184, 0.16);
color: #cbd5f5;
font-size: 0.78rem;
font-weight: 700;
}
.history-row .trigger-author {
margin-left: 0.35rem;
}