From 5ef63686f3adac50cce35bb2ae0280df48a31fe5 Mon Sep 17 00:00:00 2001 From: Noratrieb <48135649+Noratrieb@users.noreply.github.com> Date: Sun, 8 Sep 2024 12:25:36 +0200 Subject: [PATCH] Guard against completely broken nightlies --- migrations/20240908102033_nightly_is_broken.sql | 2 ++ src/build.rs | 16 ++++++++++++---- src/db.rs | 10 ++++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) create mode 100644 migrations/20240908102033_nightly_is_broken.sql diff --git a/migrations/20240908102033_nightly_is_broken.sql b/migrations/20240908102033_nightly_is_broken.sql new file mode 100644 index 0000000..2d3d7db --- /dev/null +++ b/migrations/20240908102033_nightly_is_broken.sql @@ -0,0 +1,2 @@ +ALTER TABLE finished_nightly + ADD COLUMN is_broken BOOLEAN NOT NULL DEFAULT FALSE; diff --git a/src/build.rs b/src/build.rs index db0fb4c..b4fd52a 100644 --- a/src/build.rs +++ b/src/build.rs @@ -11,7 +11,7 @@ use color_eyre::{ }; use futures::StreamExt; use tokio::process::Command; -use tracing::{debug, info}; +use tracing::{debug, error, info}; use crate::{ db::{BuildMode, Db, FullBuildInfo, Status}, @@ -38,7 +38,9 @@ impl Display for Toolchain { pub async fn background_builder(db: Db) -> Result<()> { let mut nightly_cache = NightlyCache::default(); loop { - let nightlies = Nightlies::fetch(&mut nightly_cache).await.wrap_err("fetching nightlies")?; + let nightlies = Nightlies::fetch(&mut nightly_cache) + .await + .wrap_err("fetching nightlies")?; let already_finished = db .finished_nightlies() .await @@ -48,9 +50,15 @@ pub async fn background_builder(db: Db) -> Result<()> { match next { Some((nightly, mode)) => { info!(%nightly, %mode, "Building next nightly"); - build_every_target_for_toolchain(&db, &nightly, mode) + let result = build_every_target_for_toolchain(&db, &nightly, mode) .await - .wrap_err_with(|| format!("building targets for toolchain {nightly}"))?; + .wrap_err_with(|| format!("building targets for toolchain {nightly}")); + if let Err(err) = result { + error!(%nightly, %mode, ?err, "Failed to build nightly"); + db.finish_nightly_as_broken(&nightly, mode) + .await + .wrap_err("marking nightly as broken")?; + } } None => { info!("No new nightly, waiting for an hour to try again"); diff --git a/src/db.rs b/src/db.rs index f88244a..e2ba9d0 100644 --- a/src/db.rs +++ b/src/db.rs @@ -162,4 +162,14 @@ impl Db { .wrap_err("inserting finished nightly")?; Ok(()) } + + pub async fn finish_nightly_as_broken(&self, nightly: &str, mode: BuildMode) -> Result<()> { + sqlx::query("INSERT INTO finished_nightly (nightly, mode, is_broken) VALUES (?, ?, TRUE)") + .bind(nightly) + .bind(mode) + .execute(&self.conn) + .await + .wrap_err("inserting finished broken nightly")?; + Ok(()) + } }