@@ -3,6 +3,7 @@ use std::time::Duration;
3
3
4
4
use anyhow:: Context ;
5
5
use chrono:: { DateTime , Utc } ;
6
+ use octocrab:: params:: checks:: { CheckRunConclusion , CheckRunStatus } ;
6
7
use std:: collections:: BTreeMap ;
7
8
8
9
use crate :: bors:: Comment ;
@@ -28,6 +29,22 @@ pub async fn cancel_timed_out_builds(
28
29
29
30
db. update_build_status ( & build, BuildStatus :: Cancelled )
30
31
. await ?;
32
+
33
+ if let Some ( check_run_id) = build. check_run_id {
34
+ if let Err ( error) = repo
35
+ . client
36
+ . update_check_run (
37
+ check_run_id as u64 ,
38
+ CheckRunStatus :: Completed ,
39
+ Some ( CheckRunConclusion :: TimedOut ) ,
40
+ None ,
41
+ )
42
+ . await
43
+ {
44
+ tracing:: error!( "Could not update check run {check_run_id}: {error:?}" ) ;
45
+ }
46
+ }
47
+
31
48
if let Some ( pr) = db. find_pr_by_build ( & build) . await ? {
32
49
if let Err ( error) = cancel_build_workflows ( & repo. client , db, & build) . await {
33
50
tracing:: error!(
@@ -181,11 +198,13 @@ fn elapsed_time(date: DateTime<Utc>) -> Duration {
181
198
mod tests {
182
199
use crate :: bors:: PullRequestStatus ;
183
200
use crate :: bors:: handlers:: refresh:: MOCK_TIME ;
201
+ use crate :: bors:: handlers:: trybuild:: TRY_BUILD_CHECK_RUN_NAME ;
184
202
use crate :: database:: { MergeableState , OctocrabMergeableState } ;
185
203
use crate :: tests:: mocks:: {
186
204
BorsBuilder , GitHubState , default_pr_number, default_repo_name, run_test,
187
205
} ;
188
206
use chrono:: Utc ;
207
+ use octocrab:: params:: checks:: { CheckRunConclusion , CheckRunStatus } ;
189
208
use std:: future:: Future ;
190
209
use std:: time:: Duration ;
191
210
use tokio:: runtime:: RuntimeFlavor ;
@@ -267,6 +286,33 @@ timeout = 3600
267
286
. await ;
268
287
}
269
288
289
+ #[ sqlx:: test]
290
+ async fn refresh_cancel_build_updates_check_run ( pool : sqlx:: PgPool ) {
291
+ BorsBuilder :: new ( pool)
292
+ . github ( gh_state_with_long_timeout ( ) )
293
+ . run_test ( |mut tester| async move {
294
+ tester. post_comment ( "@bors try" ) . await ?;
295
+ tester. expect_comments ( 1 ) . await ;
296
+
297
+ with_mocked_time ( Duration :: from_secs ( 4000 ) , async {
298
+ tester. cancel_timed_out_builds ( ) . await ;
299
+ } )
300
+ . await ;
301
+ tester. expect_comments ( 1 ) . await ;
302
+
303
+ tester. expect_check_run (
304
+ & tester. default_pr ( ) . await . get_gh_pr ( ) . head_sha ,
305
+ TRY_BUILD_CHECK_RUN_NAME ,
306
+ "Bors try build" ,
307
+ CheckRunStatus :: Completed ,
308
+ Some ( CheckRunConclusion :: TimedOut ) ,
309
+ ) ;
310
+
311
+ Ok ( tester)
312
+ } )
313
+ . await ;
314
+ }
315
+
270
316
#[ sqlx:: test]
271
317
async fn refresh_cancel_workflow_after_timeout ( pool : sqlx:: PgPool ) {
272
318
let gh = BorsBuilder :: new ( pool)
0 commit comments