Skip to content

Commit fc3163c

Browse files
committed
Deal with auto build push error
1 parent a5f239a commit fc3163c

File tree

3 files changed

+112
-4
lines changed

3 files changed

+112
-4
lines changed

src/bors/comment.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,3 +300,9 @@ pub fn auto_build_succeeded_comment(
300300
":sunny: Test successful - {urls}\nApproved by: `{approved_by}`\nPushing {merge_sha} to `{base_ref}`...",
301301
))
302302
}
303+
304+
pub fn auto_build_push_failed_comment(error: &str) -> Comment {
305+
Comment::new(format!(
306+
":eyes: Test was successful, but fast-forwarding failed: {error}"
307+
))
308+
}

src/bors/merge_queue.rs

Lines changed: 99 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
use anyhow::anyhow;
2-
use octocrab::params::checks::{CheckRunOutput, CheckRunStatus};
2+
use octocrab::models::CheckRunId;
3+
use octocrab::params::checks::{CheckRunConclusion, CheckRunOutput, CheckRunStatus};
34
use std::future::Future;
45
use std::sync::Arc;
56
use tokio::sync::mpsc;
67
use tracing::Instrument;
78

89
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+
};
1013
use crate::bors::{PullRequestStatus, RepositoryState};
1114
use crate::database::{BuildStatus, PullRequestModel};
1215
use crate::github::api::client::GithubRepositoryClient;
@@ -114,7 +117,36 @@ pub async fn merge_queue_tick(ctx: Arc<BorsContext>) -> anyhow::Result<()> {
114117
)
115118
.await?;
116119
}
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+
}
118150
};
119151

120152
// 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
315347
#[cfg(test)]
316348
mod tests {
317349

318-
use octocrab::params::checks::CheckRunStatus;
350+
use octocrab::params::checks::{CheckRunConclusion, CheckRunStatus};
319351
use sqlx::PgPool;
320352

321353
use crate::{
@@ -462,6 +494,69 @@ mod tests {
462494
.await;
463495
}
464496

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+
465560
#[sqlx::test]
466561
async fn auto_build_branch_history(pool: sqlx::PgPool) {
467562
let gh = run_merge_queue_test(pool, async |mut tester| {

src/tests/mocks/repository.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ pub struct Repo {
168168
pub check_runs: Vec<CheckRunData>,
169169
/// Cause pull request fetch to fail.
170170
pub pull_request_error: bool,
171+
// Cause branch push to fail.
172+
pub push_error: bool,
171173
pub pr_push_counter: u64,
172174
}
173175

@@ -184,6 +186,7 @@ impl Repo {
184186
workflow_cancel_error: false,
185187
workflow_runs: vec![],
186188
pull_request_error: false,
189+
push_error: false,
187190
pr_push_counter: 0,
188191
check_runs: vec![],
189192
}
@@ -509,6 +512,10 @@ async fn mock_update_branch(repo: Arc<Mutex<Repo>>, mock_server: &MockServer) {
509512

510513
let data: SetRefRequest = req.body_json().unwrap();
511514

515+
if repo.push_error {
516+
return ResponseTemplate::new(500).set_body_string("Push error");
517+
}
518+
512519
let sha = data.sha;
513520
match repo.get_branch_by_name(branch_name) {
514521
Some(branch) => {

0 commit comments

Comments
 (0)