diff --git a/src/bin/server/worker.rs b/src/bin/server/worker.rs index 3d22593..c38df0c 100644 --- a/src/bin/server/worker.rs +++ b/src/bin/server/worker.rs @@ -295,6 +295,10 @@ impl Worker { Some(job_name) => format!("The job **`{}`**", job_name), None => "A job".to_owned(), }; + let trailer = match log_variables.doc_url { + Some(url) => format!("\nFor more information how to resolve CI failures of this job, visit this [link]({url})."), + None => "".to_string(), + }; let log_url = job.log_url().unwrap_or_else(|| "unknown".into()); self.github.post_comment(repo, pr, &format!(r#" @@ -307,7 +311,7 @@ impl Worker { ``` - "#, opening = opening, html_url = job.html_url(), log_url = log_url, log = extracted))?; +{trailer}"#, opening = opening, html_url = job.html_url(), log_url = log_url, log = extracted, trailer = trailer))?; info!("marked build {} as recently notified", build_id); self.recently_notified.store(build_id); diff --git a/src/log_variables.rs b/src/log_variables.rs index 2a0be45..7965d21 100644 --- a/src/log_variables.rs +++ b/src/log_variables.rs @@ -4,10 +4,14 @@ const SEPARATOR: u8 = b'='; const JOB_NAME_VARIABLE: &str = "CI_JOB_NAME"; const PR_NUMBER_VARIABLE: &str = "CI_PR_NUMBER"; +/// URL pointing to a documentation page about the job. +/// Added in https://github.com/rust-lang/rust/pull/136911. +const JOB_DOC_URL: &str = "CI_JOB_DOC_URL"; pub struct LogVariables<'a> { pub job_name: Option<&'a str>, pub pr_number: Option<&'a str>, + pub doc_url: Option<&'a str>, } impl<'a> LogVariables<'a> { @@ -15,6 +19,7 @@ impl<'a> LogVariables<'a> { let mut result = LogVariables { job_name: None, pr_number: None, + doc_url: None, }; for line in lines { @@ -26,9 +31,12 @@ impl<'a> LogVariables<'a> { if result.pr_number.is_none() { result.pr_number = extract_variable(sanitized, PR_NUMBER_VARIABLE); } + if result.doc_url.is_none() { + result.doc_url = extract_variable(sanitized, JOB_DOC_URL); + } // Early exit if everything was found - if result.job_name.is_some() && result.pr_number.is_some() { + if result.job_name.is_some() && result.pr_number.is_some() && result.doc_url.is_some() { break; } } @@ -72,10 +80,16 @@ mod tests { Sanitized("baz"), Sanitized("[CI_PR_NUMBER=123]"), Sanitized("quux"), + Sanitized("[CI_JOB_DOC_URL=https://github.com/rust-lang/rust/job1]"), + Sanitized("foobar"), ]; let extracted = LogVariables::extract(LOG); assert_eq!(Some("test-job"), extracted.job_name); assert_eq!(Some("123"), extracted.pr_number); + assert_eq!( + Some("https://github.com/rust-lang/rust/job1"), + extracted.doc_url + ); } }