Show quire-ci log in run detail web view
Read quire-ci.log (combined stdout+stderr of the quire-ci subprocess)
concurrently with per-sh CRI logs and display it after the jobs section
when non-empty. Useful for diagnosing crashes and Fennel compile errors
that happen before any jobs run.
https://claude.ai/code/session_015wNKXpwJc6s4Hrs1t9fXdm
diff --git a/quire-server/src/quire/web/handlers.rs b/quire-server/src/quire/web/handlers.rs
index 1ee7a69..da0cc5e 100644
--- a/quire-server/src/quire/web/handlers.rs
+++ b/quire-server/src/quire/web/handlers.rs
@@ -187,7 +187,13 @@ pub async fn run_detail(
}
let runs_base = quire.base_dir().join("runs").join(&repo_name);
- let job_dir_base = runs_base.join(&run_id).join("jobs");
+ let run_dir = runs_base.join(&run_id);
+ let job_dir_base = run_dir.join("jobs");
+
+ // Spawn quire-ci.log read concurrently with the per-sh log reads below.
+ let quire_ci_log_path = run_dir.join("quire-ci.log");
+ let quire_ci_log_handle: tokio::task::JoinHandle<String> =
+ tokio::spawn(async move { read_log(&quire_ci_log_path).await });
// Build a flat list of log paths keyed by (job index, event index)
// so we can issue all reads concurrently and reassemble in order.
@@ -258,6 +264,8 @@ pub async fn run_detail(
});
}
+ let quire_ci_log = quire_ci_log_handle.await.unwrap_or_default();
+
let crumbs = vec![
Crumb::with_href("ci", format!("/{}/ci", repo_display)),
Crumb::new(detail_run.sha_short()),
@@ -267,6 +275,7 @@ pub async fn run_detail(
crumbs,
run: detail_run,
jobs: detail_jobs,
+ quire_ci_log,
};
render(&tmpl)
}
diff --git a/quire-server/src/quire/web/templates.rs b/quire-server/src/quire/web/templates.rs
index 0a43a34..c72e957 100644
--- a/quire-server/src/quire/web/templates.rs
+++ b/quire-server/src/quire/web/templates.rs
@@ -94,6 +94,7 @@ pub struct RunDetailTemplate {
pub crumbs: Vec<Crumb>,
pub run: DetailRun,
pub jobs: Vec<DetailJob>,
+ pub quire_ci_log: String,
}
impl RunDetailTemplate {
diff --git a/quire-server/templates/ci/run_detail.html b/quire-server/templates/ci/run_detail.html
index 819e1c4..37db90a 100644
--- a/quire-server/templates/ci/run_detail.html
+++ b/quire-server/templates/ci/run_detail.html
@@ -46,4 +46,10 @@
{% else %}
<div class="ci-empty">no jobs recorded</div>
{% endfor %}
+{% if !quire_ci_log.is_empty() %}
+<div class="ci-job">
+ <div class="ci-job-header">quire-ci</div>
+ <pre class="ci-sh-log">{{ quire_ci_log }}</pre>
+</div>
+{% endif %}
{% endblock %}