1- use std:: sync:: Arc ;
2- use std:: time:: Duration ;
3-
4- use octocrab:: params:: checks:: CheckRunConclusion ;
5- use octocrab:: params:: checks:: CheckRunStatus ;
6-
71use crate :: PgDbClient ;
8- use crate :: bors:: comment:: { try_build_succeeded_comment , workflow_failed_comment } ;
2+ use crate :: bors:: comment:: { build_failed_comment , try_build_succeeded_comment } ;
93use crate :: bors:: event:: { WorkflowRunCompleted , WorkflowRunStarted } ;
104use crate :: bors:: handlers:: is_bors_observed_branch;
115use crate :: bors:: handlers:: labels:: handle_label_trigger;
126use crate :: bors:: merge_queue:: AUTO_BRANCH_NAME ;
137use crate :: bors:: merge_queue:: MergeQueueSender ;
14- use crate :: bors:: { RepositoryState , WorkflowRun } ;
15- use crate :: database:: { BuildStatus , WorkflowStatus } ;
8+ use crate :: bors:: { FailedWorkflowRun , RepositoryState , WorkflowRun } ;
9+ use crate :: database:: { BuildStatus , WorkflowModel , WorkflowStatus } ;
1610use crate :: github:: LabelTrigger ;
11+ use octocrab:: models:: CheckRunId ;
12+ use octocrab:: models:: workflows:: { Conclusion , Job , Status } ;
13+ use octocrab:: params:: checks:: CheckRunConclusion ;
14+ use octocrab:: params:: checks:: CheckRunStatus ;
15+ use std:: sync:: Arc ;
16+ use std:: time:: Duration ;
1717
1818pub ( super ) async fn handle_workflow_started (
1919 db : Arc < PgDbClient > ,
@@ -203,20 +203,40 @@ async fn maybe_complete_build(
203203
204204 if let Err ( error) = repo
205205 . client
206- . update_check_run ( check_run_id as u64 , status, conclusion, None )
206+ . update_check_run ( CheckRunId ( check_run_id as u64 ) , status, conclusion, None )
207207 . await
208208 {
209209 tracing:: error!( "Could not update check run {check_run_id}: {error:?}" ) ;
210210 }
211211 }
212212
213213 db_workflow_runs. sort_by ( |a, b| a. name . cmp ( & b. name ) ) ;
214+
214215 let message = if !has_failure {
215- tracing:: info!( "Workflow succeeded" ) ;
216+ tracing:: info!( "Build succeeded" ) ;
216217 try_build_succeeded_comment ( & db_workflow_runs, payload. commit_sha , & build)
217218 } else {
218- tracing:: info!( "Workflow failed" ) ;
219- workflow_failed_comment ( & db_workflow_runs)
219+ // Download failed jobs
220+ let mut workflow_runs: Vec < FailedWorkflowRun > = vec ! [ ] ;
221+ for workflow_run in db_workflow_runs {
222+ let failed_jobs = match get_failed_jobs ( & repo, & workflow_run) . await {
223+ Ok ( jobs) => jobs,
224+ Err ( error) => {
225+ tracing:: error!(
226+ "Cannot download jobs for workflow run {}: {error:?}" ,
227+ workflow_run. run_id
228+ ) ;
229+ vec ! [ ]
230+ }
231+ } ;
232+ workflow_runs. push ( FailedWorkflowRun {
233+ workflow_run,
234+ failed_jobs,
235+ } )
236+ }
237+
238+ tracing:: info!( "Build failed" ) ;
239+ build_failed_comment ( repo. repository ( ) , workflow_runs)
220240 } ;
221241 repo. client . post_comment ( pr. number , message) . await ?;
222242
@@ -228,6 +248,29 @@ async fn maybe_complete_build(
228248 Ok ( ( ) )
229249}
230250
251+ /// Return failed jobs from the given workflow run.
252+ async fn get_failed_jobs (
253+ repo : & RepositoryState ,
254+ workflow_run : & WorkflowModel ,
255+ ) -> anyhow:: Result < Vec < Job > > {
256+ let jobs = repo
257+ . client
258+ . get_jobs_for_workflow_run ( workflow_run. run_id . into ( ) )
259+ . await ?;
260+ Ok ( jobs
261+ . into_iter ( )
262+ . filter ( |j| {
263+ j. status == Status :: Failed || {
264+ j. status == Status :: Completed
265+ && matches ! (
266+ j. conclusion,
267+ Some ( Conclusion :: Failure | Conclusion :: Cancelled | Conclusion :: TimedOut )
268+ )
269+ }
270+ } )
271+ . collect ( ) )
272+ }
273+
231274#[ cfg( test) ]
232275mod tests {
233276 use crate :: database:: WorkflowStatus ;
@@ -376,11 +419,7 @@ mod tests {
376419 tester. workflow_event ( WorkflowEvent :: failure ( w2) ) . await ?;
377420 insta:: assert_snapshot!(
378421 tester. get_comment( ) . await ?,
379- @r"
380- :broken_heart: Test failed
381- - [Workflow1](https://github.com/workflows/Workflow1/1) :question:
382- - [Workflow1](https://github.com/workflows/Workflow1/2) :x:
383- "
422+ @":broken_heart: Test failed ([Workflow1](https://github.com/workflows/Workflow1/1), [Workflow1](https://github.com/workflows/Workflow1/2))"
384423 ) ;
385424 Ok ( ( ) )
386425 } )
0 commit comments