|
1 | 1 | use anyhow::anyhow;
|
2 |
| -use octocrab::params::checks::{CheckRunOutput, CheckRunStatus}; |
| 2 | +use octocrab::models::CheckRunId; |
| 3 | +use octocrab::params::checks::{CheckRunConclusion, CheckRunOutput, CheckRunStatus}; |
3 | 4 | use std::future::Future;
|
4 | 5 | use std::sync::Arc;
|
5 | 6 | use tokio::sync::mpsc;
|
6 | 7 | use tracing::Instrument;
|
7 | 8 |
|
8 | 9 | use crate::BorsContext;
|
9 |
| -use crate::bors::comment::{auto_build_started_comment, auto_build_succeeded_comment}; |
| 10 | +use crate::bors::comment::{ |
| 11 | + auto_build_push_failed_comment, auto_build_started_comment, auto_build_succeeded_comment, |
| 12 | +}; |
10 | 13 | use crate::bors::{PullRequestStatus, RepositoryState};
|
11 | 14 | use crate::database::{BuildStatus, PullRequestModel};
|
12 | 15 | use crate::github::api::client::GithubRepositoryClient;
|
@@ -114,7 +117,36 @@ pub async fn merge_queue_tick(ctx: Arc<BorsContext>) -> anyhow::Result<()> {
|
114 | 117 | )
|
115 | 118 | .await?;
|
116 | 119 | }
|
117 |
| - Err(_) => {} |
| 120 | + Err(error) => { |
| 121 | + tracing::error!( |
| 122 | + "Failed to push PR {pr_num} to base branch: {:?}", |
| 123 | + error |
| 124 | + ); |
| 125 | + |
| 126 | + if let Some(check_run_id) = auto_build.check_run_id { |
| 127 | + if let Err(error) = repo |
| 128 | + .client |
| 129 | + .update_check_run( |
| 130 | + CheckRunId(check_run_id as u64), |
| 131 | + CheckRunStatus::Completed, |
| 132 | + Some(CheckRunConclusion::Failure), |
| 133 | + None, |
| 134 | + ) |
| 135 | + .await |
| 136 | + { |
| 137 | + tracing::error!( |
| 138 | + "Could not update check run {check_run_id}: {error:?}" |
| 139 | + ); |
| 140 | + } |
| 141 | + } |
| 142 | + |
| 143 | + ctx.db |
| 144 | + .update_build_status(auto_build, BuildStatus::Failure) |
| 145 | + .await?; |
| 146 | + |
| 147 | + let comment = auto_build_push_failed_comment(&error.to_string()); |
| 148 | + repo.client.post_comment(pr.number, comment).await?; |
| 149 | + } |
118 | 150 | };
|
119 | 151 |
|
120 | 152 | // Break to give GitHub time to update the base branch.
|
@@ -315,7 +347,7 @@ pub fn start_merge_queue(ctx: Arc<BorsContext>) -> (MergeQueueSender, impl Futur
|
315 | 347 | #[cfg(test)]
|
316 | 348 | mod tests {
|
317 | 349 |
|
318 |
| - use octocrab::params::checks::CheckRunStatus; |
| 350 | + use octocrab::params::checks::{CheckRunConclusion, CheckRunStatus}; |
319 | 351 | use sqlx::PgPool;
|
320 | 352 |
|
321 | 353 | use crate::{
|
@@ -462,6 +494,69 @@ mod tests {
|
462 | 494 | .await;
|
463 | 495 | }
|
464 | 496 |
|
| 497 | + #[sqlx::test] |
| 498 | + async fn auto_build_push_fail_comment(pool: sqlx::PgPool) { |
| 499 | + run_merge_queue_test(pool, async |mut tester| { |
| 500 | + start_auto_build(&mut tester).await?; |
| 501 | + tester.workflow_full_success(tester.auto_branch()).await?; |
| 502 | + tester.expect_comments(1).await; |
| 503 | + |
| 504 | + tester.default_repo().lock().push_error = true; |
| 505 | + |
| 506 | + tester.process_merge_queue().await; |
| 507 | + insta::assert_snapshot!( |
| 508 | + tester.get_comment().await?, |
| 509 | + @":eyes: Test was successful, but fast-forwarding failed: IO error" |
| 510 | + ); |
| 511 | + Ok(()) |
| 512 | + }) |
| 513 | + .await; |
| 514 | + } |
| 515 | + |
| 516 | + #[sqlx::test] |
| 517 | + async fn auto_build_push_fail_updates_check_run(pool: sqlx::PgPool) { |
| 518 | + run_merge_queue_test(pool, async |mut tester| { |
| 519 | + start_auto_build(&mut tester).await?; |
| 520 | + tester.workflow_full_success(tester.auto_branch()).await?; |
| 521 | + tester.expect_comments(1).await; |
| 522 | + |
| 523 | + tester.default_repo().lock().push_error = true; |
| 524 | + |
| 525 | + tester.process_merge_queue().await; |
| 526 | + tester.expect_comments(1).await; |
| 527 | + tester.expect_check_run( |
| 528 | + &tester.default_pr().await.get_gh_pr().head_sha, |
| 529 | + AUTO_BUILD_CHECK_RUN_NAME, |
| 530 | + AUTO_BUILD_CHECK_RUN_NAME, |
| 531 | + CheckRunStatus::Completed, |
| 532 | + Some(CheckRunConclusion::Failure), |
| 533 | + ); |
| 534 | + Ok(()) |
| 535 | + }) |
| 536 | + .await; |
| 537 | + } |
| 538 | + |
| 539 | + #[sqlx::test] |
| 540 | + async fn auto_build_push_fail_in_db(pool: sqlx::PgPool) { |
| 541 | + run_merge_queue_test(pool, async |mut tester| { |
| 542 | + start_auto_build(&mut tester).await?; |
| 543 | + tester.workflow_full_success(tester.auto_branch()).await?; |
| 544 | + tester.expect_comments(1).await; |
| 545 | + |
| 546 | + tester.default_repo().lock().push_error = true; |
| 547 | + |
| 548 | + tester.process_merge_queue().await; |
| 549 | + tester.expect_comments(1).await; |
| 550 | + tester |
| 551 | + .wait_for_default_pr(|pr| { |
| 552 | + pr.auto_build.as_ref().unwrap().status == BuildStatus::Failure |
| 553 | + }) |
| 554 | + .await?; |
| 555 | + Ok(()) |
| 556 | + }) |
| 557 | + .await; |
| 558 | + } |
| 559 | + |
465 | 560 | #[sqlx::test]
|
466 | 561 | async fn auto_build_branch_history(pool: sqlx::PgPool) {
|
467 | 562 | let gh = run_merge_queue_test(pool, async |mut tester| {
|
|
0 commit comments