@@ -9,6 +9,7 @@ use crate::bors::CheckSuiteStatus;
9
9
use crate :: bors:: RepositoryState ;
10
10
use crate :: bors:: comment:: { try_build_succeeded_comment, workflow_failed_comment} ;
11
11
use crate :: bors:: event:: { CheckSuiteCompleted , WorkflowCompleted , WorkflowStarted } ;
12
+ use crate :: bors:: handlers:: TRY_BRANCH_NAME ;
12
13
use crate :: bors:: handlers:: is_bors_observed_branch;
13
14
use crate :: bors:: handlers:: labels:: handle_label_trigger;
14
15
use crate :: bors:: merge_queue:: AUTO_BRANCH_NAME ;
@@ -176,6 +177,7 @@ async fn try_complete_build(
176
177
let has_failure = checks
177
178
. iter ( )
178
179
. any ( |check| matches ! ( check. status, CheckSuiteStatus :: Failure ) ) ;
180
+ let build_succeeded = !has_failure;
179
181
180
182
let mut workflows = db. get_workflows_for_build ( & build) . await ?;
181
183
workflows. sort_by ( |a, b| a. name . cmp ( & b. name ) ) ;
@@ -192,42 +194,78 @@ async fn try_complete_build(
192
194
return Ok ( ( ) ) ;
193
195
}
194
196
195
- let ( status, trigger) = if has_failure {
196
- ( BuildStatus :: Failure , LabelTrigger :: TryBuildFailed )
197
+ let pr_num = pr. number ;
198
+
199
+ if build_succeeded {
200
+ tracing:: info!( "Build succeeded for PR {pr_num}" ) ;
197
201
} else {
198
- ( BuildStatus :: Success , LabelTrigger :: TryBuildSucceeded )
202
+ tracing:: info!( "Build failed for PR {pr_num}" ) ;
203
+ }
204
+
205
+ let branch = payload. branch . as_str ( ) ;
206
+ let ( status, trigger, comment_opt) = match ( branch, build_succeeded) {
207
+ ( TRY_BRANCH_NAME , true ) => (
208
+ BuildStatus :: Success ,
209
+ LabelTrigger :: TryBuildSucceeded ,
210
+ Some ( try_build_succeeded_comment (
211
+ & workflows,
212
+ payload. commit_sha . clone ( ) ,
213
+ & build,
214
+ ) ) ,
215
+ ) ,
216
+ ( TRY_BRANCH_NAME , false ) => (
217
+ BuildStatus :: Failure ,
218
+ LabelTrigger :: TryBuildFailed ,
219
+ Some ( workflow_failed_comment ( & workflows) ) ,
220
+ ) ,
221
+ ( AUTO_BRANCH_NAME , true ) => ( BuildStatus :: Success , LabelTrigger :: Succeeded , None ) ,
222
+ ( AUTO_BRANCH_NAME , false ) => (
223
+ BuildStatus :: Failure ,
224
+ LabelTrigger :: Failed ,
225
+ Some ( workflow_failed_comment ( & workflows) ) ,
226
+ ) ,
227
+ _ => unreachable ! ( "Branch should be bors observed branch" ) ,
199
228
} ;
229
+
200
230
db. update_build_status ( & build, status) . await ?;
231
+ handle_label_trigger ( repo, pr_num, trigger) . await ?;
201
232
202
- handle_label_trigger ( repo, pr. number , trigger) . await ?;
233
+ if let Some ( comment) = comment_opt {
234
+ repo. client . post_comment ( pr_num, comment) . await ?;
235
+ }
203
236
204
237
if let Some ( check_run_id) = build. check_run_id {
205
- let ( status, conclusion) = if has_failure {
206
- ( CheckRunStatus :: Completed , Some ( CheckRunConclusion :: Failure ) )
238
+ tracing:: info!(
239
+ "Updating check run {check_run_id} for build {} on {branch}" ,
240
+ build. commit_sha,
241
+ ) ;
242
+ let conclusion = if build_succeeded {
243
+ Some ( CheckRunConclusion :: Success )
207
244
} else {
208
- ( CheckRunStatus :: Completed , Some ( CheckRunConclusion :: Success ) )
245
+ Some ( CheckRunConclusion :: Failure )
209
246
} ;
210
247
211
248
if let Err ( error) = repo
212
249
. client
213
- . update_check_run ( check_run_id as u64 , status, conclusion, None )
250
+ . update_check_run (
251
+ check_run_id as u64 ,
252
+ CheckRunStatus :: Completed ,
253
+ conclusion,
254
+ None ,
255
+ )
214
256
. await
215
257
{
216
258
tracing:: error!( "Could not update check run {check_run_id}: {error:?}" ) ;
217
259
}
218
- }
219
-
220
- let message = if !has_failure {
221
- tracing:: info!( "Workflow succeeded" ) ;
222
- try_build_succeeded_comment ( & workflows, payload. commit_sha , & build)
223
260
} else {
224
- tracing:: info!( "Workflow failed" ) ;
225
- workflow_failed_comment ( & workflows)
226
- } ;
227
- repo. client . post_comment ( pr. number , message) . await ?;
261
+ tracing:: warn!(
262
+ "No check_run_id found for build {} on {branch}" ,
263
+ build. commit_sha,
264
+ ) ;
265
+ }
228
266
229
267
// Trigger merge queue when an auto build completes
230
- if payload . branch == AUTO_BRANCH_NAME {
268
+ if branch == AUTO_BRANCH_NAME {
231
269
merge_queue_tx. trigger ( ) . await ?;
232
270
}
233
271
@@ -236,8 +274,10 @@ async fn try_complete_build(
236
274
237
275
#[ cfg( test) ]
238
276
mod tests {
277
+ use octocrab:: params:: checks:: { CheckRunConclusion , CheckRunStatus } ;
278
+
239
279
use crate :: bors:: handlers:: trybuild:: TRY_BRANCH_NAME ;
240
- use crate :: bors:: merge_queue:: { AUTO_BUILD_CHECK_RUN_NAME , AUTO_BRANCH_NAME } ;
280
+ use crate :: bors:: merge_queue:: { AUTO_BRANCH_NAME , AUTO_BUILD_CHECK_RUN_NAME } ;
241
281
use crate :: database:: WorkflowStatus ;
242
282
use crate :: database:: operations:: get_all_workflows;
243
283
use crate :: tests:: mocks:: {
@@ -424,4 +464,97 @@ mod tests {
424
464
} )
425
465
. await ;
426
466
}
467
+
468
+ #[ sqlx:: test]
469
+ async fn auto_build_success_comment ( pool : sqlx:: PgPool ) {
470
+ run_test ( pool, |mut tester| async {
471
+ tester. create_branch ( AUTO_BRANCH_NAME ) . expect_suites ( 1 ) ;
472
+
473
+ tester. post_comment ( "@bors r+" ) . await ?;
474
+ tester. expect_comments ( 1 ) . await ;
475
+
476
+ tester. process_merge_queue ( ) . await ;
477
+ tester. expect_comments ( 1 ) . await ;
478
+
479
+ tester. workflow_success ( tester. auto_branch ( ) ) . await ?;
480
+ tester. process_merge_queue ( ) . await ;
481
+ insta:: assert_snapshot!(
482
+ tester. get_comment( ) . await ?,
483
+ @r"
484
+ :sunny: Test successful - [Workflow1](https://github.com/workflows/Workflow1/1)
485
+ Approved by: `default-user`
486
+ Pushing merge-main-sha1-pr-1-sha-0 to `main`...
487
+ "
488
+ ) ;
489
+
490
+ Ok ( tester)
491
+ } )
492
+ . await ;
493
+ }
494
+
495
+ #[ sqlx:: test]
496
+ async fn auto_build_check_run_success ( pool : sqlx:: PgPool ) {
497
+ run_test ( pool, |mut tester| async {
498
+ tester. create_branch ( AUTO_BRANCH_NAME ) . expect_suites ( 1 ) ;
499
+
500
+ tester. post_comment ( "@bors r+" ) . await ?;
501
+ tester. expect_comments ( 1 ) . await ;
502
+
503
+ tester. process_merge_queue ( ) . await ;
504
+ tester. expect_comments ( 1 ) . await ;
505
+
506
+ tester. workflow_success ( tester. auto_branch ( ) ) . await ?;
507
+ tester. process_merge_queue ( ) . await ;
508
+ tester. expect_comments ( 1 ) . await ;
509
+
510
+ tester. expect_check_run (
511
+ & tester. default_pr ( ) . await . get_gh_pr ( ) . head_sha ,
512
+ AUTO_BUILD_CHECK_RUN_NAME ,
513
+ AUTO_BUILD_CHECK_RUN_NAME ,
514
+ CheckRunStatus :: Completed ,
515
+ Some ( CheckRunConclusion :: Success ) ,
516
+ ) ;
517
+
518
+ Ok ( tester)
519
+ } )
520
+ . await ;
521
+ }
522
+
523
+ #[ sqlx:: test]
524
+ async fn auto_build_success_labels ( pool : sqlx:: PgPool ) {
525
+ let github = GitHubState :: default ( ) . with_default_config (
526
+ r#"
527
+ merge_queue_enabled = true
528
+
529
+ [labels]
530
+ succeeded = ["+foo", "+bar", "-baz"]
531
+ "# ,
532
+ ) ;
533
+
534
+ BorsBuilder :: new ( pool)
535
+ . github ( github)
536
+ . run_test ( |mut tester| async {
537
+ tester. create_branch ( AUTO_BRANCH_NAME ) . expect_suites ( 1 ) ;
538
+ tester. post_comment ( "@bors r+" ) . await ?;
539
+ tester. expect_comments ( 1 ) . await ;
540
+
541
+ tester. process_merge_queue ( ) . await ;
542
+ tester. expect_comments ( 1 ) . await ;
543
+
544
+ let repo = tester. default_repo ( ) ;
545
+ repo. lock ( )
546
+ . get_pr ( default_pr_number ( ) )
547
+ . check_added_labels ( & [ ] ) ;
548
+ tester. workflow_success ( tester. auto_branch ( ) ) . await ?;
549
+ tester. process_merge_queue ( ) . await ;
550
+ tester. expect_comments ( 1 ) . await ;
551
+
552
+ let pr = repo. lock ( ) . get_pr ( default_pr_number ( ) ) . clone ( ) ;
553
+ pr. check_added_labels ( & [ "foo" , "bar" ] ) ;
554
+ pr. check_removed_labels ( & [ "baz" ] ) ;
555
+
556
+ Ok ( tester)
557
+ } )
558
+ . await ;
559
+ }
427
560
}
0 commit comments