Skip to content

Commit 68be4a0

Browse files
committed
Update check run on build cancelled
1 parent 1069a46 commit 68be4a0

File tree

3 files changed

+95
-24
lines changed

3 files changed

+95
-24
lines changed

src/bors/handlers/pr_events.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use crate::bors::mergeable_queue::MergeableQueueSender;
1010
use crate::bors::{Comment, PullRequestStatus, RepositoryState};
1111
use crate::database::{BuildStatus, MergeableState};
1212
use crate::github::{CommitSha, LabelTrigger, PullRequestNumber};
13+
use octocrab::params::checks::CheckRunConclusion;
1314
use std::sync::Arc;
1415

1516
pub(super) async fn handle_pull_request_edited(
@@ -58,7 +59,14 @@ pub(super) async fn handle_push_to_pull_request(
5859
if auto_build.status == BuildStatus::Pending {
5960
tracing::info!("Cancelling auto build for PR {pr_number} due to push");
6061

61-
match cancel_build_workflows(&repo_state.client, db.as_ref(), auto_build).await {
62+
match cancel_build_workflows(
63+
&repo_state.client,
64+
db.as_ref(),
65+
auto_build,
66+
CheckRunConclusion::Cancelled,
67+
)
68+
.await
69+
{
6270
Err(error) => {
6371
tracing::error!(
6472
"Could not cancel workflows for SHA {}: {error:?}",

src/bors/handlers/refresh.rs

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,14 @@ use std::time::Duration;
33

44
use anyhow::Context;
55
use chrono::{DateTime, Utc};
6-
use octocrab::params::checks::{CheckRunConclusion, CheckRunStatus};
6+
use octocrab::params::checks::CheckRunConclusion;
77
use std::collections::BTreeMap;
88

99
use crate::bors::Comment;
1010
use crate::bors::PullRequestStatus;
1111
use crate::bors::RepositoryState;
1212
use crate::bors::handlers::trybuild::cancel_build_workflows;
1313
use crate::bors::mergeable_queue::MergeableQueueSender;
14-
use crate::database::BuildStatus;
1514
use crate::{PgDbClient, TeamApiClient};
1615

1716
/// Cancel CI builds that have been running for too long
@@ -27,26 +26,11 @@ pub async fn cancel_timed_out_builds(
2726
if elapsed_time(build.created_at) >= timeout {
2827
tracing::info!("Cancelling build {}", build.commit_sha);
2928

30-
db.update_build_status(&build, BuildStatus::Cancelled)
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-
4829
if let Some(pr) = db.find_pr_by_build(&build).await? {
49-
if let Err(error) = cancel_build_workflows(&repo.client, db, &build).await {
30+
if let Err(error) =
31+
cancel_build_workflows(&repo.client, db, &build, CheckRunConclusion::TimedOut)
32+
.await
33+
{
5034
tracing::error!(
5135
"Could not cancel workflows for SHA {}: {error:?}",
5236
build.commit_sha

src/bors/handlers/trybuild.rs

Lines changed: 81 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::github::{CommitSha, GithubUser, LabelTrigger, MergeError, PullRequest
1919
use crate::permissions::PermissionType;
2020
use crate::utils::text::suppress_github_mentions;
2121
use anyhow::{Context, anyhow};
22+
use octocrab::params::checks::CheckRunConclusion;
2223
use octocrab::params::checks::CheckRunOutput;
2324
use octocrab::params::checks::CheckRunStatus;
2425
use tracing::log;
@@ -155,7 +156,7 @@ async fn cancel_previous_try_build(
155156
) -> anyhow::Result<Vec<String>> {
156157
assert_eq!(build.status, BuildStatus::Pending);
157158

158-
match cancel_build_workflows(&repo.client, db, build).await {
159+
match cancel_build_workflows(&repo.client, db, build, CheckRunConclusion::Cancelled).await {
159160
Ok(workflow_ids) => {
160161
tracing::info!("Try build cancelled");
161162
Ok(repo
@@ -267,7 +268,14 @@ pub(super) async fn command_try_cancel(
267268
return Ok(());
268269
};
269270

270-
match cancel_build_workflows(&repo.client, db.as_ref(), build).await {
271+
match cancel_build_workflows(
272+
&repo.client,
273+
db.as_ref(),
274+
build,
275+
CheckRunConclusion::Cancelled,
276+
)
277+
.await
278+
{
271279
Err(error) => {
272280
tracing::error!(
273281
"Could not cancel workflows for SHA {}: {error:?}",
@@ -298,6 +306,7 @@ pub async fn cancel_build_workflows(
298306
client: &GithubRepositoryClient,
299307
db: &PgDbClient,
300308
build: &BuildModel,
309+
check_run_conclusion: CheckRunConclusion,
301310
) -> anyhow::Result<Vec<RunId>> {
302311
let pending_workflows = db.get_pending_workflows_for_build(build).await?;
303312

@@ -307,6 +316,20 @@ pub async fn cancel_build_workflows(
307316
db.update_build_status(build, BuildStatus::Cancelled)
308317
.await?;
309318

319+
if let Some(check_run_id) = build.check_run_id {
320+
if let Err(error) = client
321+
.update_check_run(
322+
check_run_id as u64,
323+
CheckRunStatus::Completed,
324+
Some(check_run_conclusion),
325+
None,
326+
)
327+
.await
328+
{
329+
tracing::error!("Could not update check run {check_run_id}: {error:?}");
330+
}
331+
}
332+
310333
Ok(pending_workflows)
311334
}
312335

@@ -967,4 +990,60 @@ try_failed = ["+foo", "+bar", "-baz"]
967990
})
968991
.await;
969992
}
993+
994+
#[sqlx::test]
995+
async fn try_cancel_updates_check_run_to_cancelled(pool: sqlx::PgPool) {
996+
run_test(pool.clone(), |mut tester| async {
997+
tester.create_branch(TRY_BRANCH_NAME).expect_suites(1);
998+
tester.post_comment("@bors try").await?;
999+
tester.expect_comments(1).await;
1000+
1001+
tester.post_comment("@bors try cancel").await?;
1002+
tester.expect_comments(1).await;
1003+
1004+
tester.expect_check_run(
1005+
&tester.default_pr().await.get_gh_pr().head_sha,
1006+
TRY_BUILD_CHECK_RUN_NAME,
1007+
"Bors try build",
1008+
CheckRunStatus::Completed,
1009+
Some(CheckRunConclusion::Cancelled),
1010+
);
1011+
1012+
Ok(tester)
1013+
})
1014+
.await;
1015+
}
1016+
1017+
#[sqlx::test]
1018+
async fn new_try_build_cancels_previous_and_updates_check_run(pool: sqlx::PgPool) {
1019+
run_test(pool.clone(), |mut tester| async {
1020+
tester.create_branch(TRY_BRANCH_NAME).expect_suites(1);
1021+
tester.post_comment("@bors try").await?;
1022+
tester.expect_comments(1).await;
1023+
1024+
let prev_sha = tester.default_pr().await.get_gh_pr().head_sha;
1025+
tester
1026+
.push_to_pr(default_repo_name(), default_pr_number())
1027+
.await?;
1028+
tester.post_comment("@bors try").await?;
1029+
tester.expect_comments(1).await;
1030+
1031+
tester.expect_check_run(
1032+
&prev_sha,
1033+
TRY_BUILD_CHECK_RUN_NAME,
1034+
"Bors try build",
1035+
CheckRunStatus::Completed,
1036+
Some(CheckRunConclusion::Cancelled),
1037+
);
1038+
tester.expect_check_run(
1039+
&tester.default_pr().await.get_gh_pr().head_sha,
1040+
TRY_BUILD_CHECK_RUN_NAME,
1041+
"Bors try build",
1042+
CheckRunStatus::InProgress,
1043+
None,
1044+
);
1045+
Ok(tester)
1046+
})
1047+
.await;
1048+
}
9701049
}

0 commit comments

Comments
 (0)