Skip to content

Commit 7037d75

Browse files
MagicRBMic92
authored andcommitted
Remember first failed build URL and display it in cached failures
Signed-off-by: magic_rb <[email protected]>
1 parent ee69ecc commit 7037d75

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

buildbot_nix/__init__.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -193,14 +193,15 @@ def schedule_eval_failure(self, job: NixEvalJobError) -> tuple[str, Properties]:
193193
return (self.failed_eval_scheduler, props)
194194

195195
def schedule_cached_failure(
196-
self, job: NixEvalJobSuccess, first_failure: datetime
196+
self, job: NixEvalJobSuccess, first_failure: datetime, first_failure_url: str,
197197
) -> tuple[str, Properties]:
198198
source = "nix-eval-nix"
199199

200200
props = BuildTrigger.set_common_properties(
201201
Properties(), self.project, source, job
202202
)
203203
props.setProperty("first_failure", str(first_failure), source)
204+
props.setProperty("first_failure_url", first_failure_url, source)
204205

205206
return (self.cached_failure_scheduler, props)
206207

@@ -475,12 +476,13 @@ def run(self) -> Generator[Any, Any, None]:
475476
elif failed_build is not None and self.build.reason != "rebuild":
476477
scheduler_log.addStdout(
477478
f"\t- skipping {build.attr} due to cached failure, first failed at {failed_build.time}\n"
479+
+ f"\t see build at {failed_build.url}\n"
478480
)
479481
build_schedule_order.remove(build)
480482

481483
brids, results_deferred = yield self.schedule(
482484
ss_for_trigger,
483-
*self.schedule_cached_failure(build, failed_build.time),
485+
*self.schedule_cached_failure(build, failed_build.time, failed_build.url),
484486
)
485487
scheduled.append(
486488
BuildTrigger.ScheduledJob(build, brids, results_deferred)
@@ -543,7 +545,9 @@ def run(self) -> Generator[Any, Any, None]:
543545
# if it failed, remove all dependent jobs, schedule placeholders and add them to the list of scheduled jobs
544546
if isinstance(job, NixEvalJobSuccess):
545547
if result != SUCCESS:
546-
failed_builds.add_build(job.drvPath, datetime.now(tz=UTC))
548+
if self.build.reason == "rebuild" or not failed_builds.check_build(job.drvPath):
549+
url = yield self.build.getUrl()
550+
failed_builds.add_build(job.drvPath, datetime.now(tz=UTC), url)
547551

548552
removed = self.get_failed_dependents(
549553
job, build_schedule_order, job_closures
@@ -731,6 +735,7 @@ def run(self) -> Generator[Any, object, int]:
731735
[
732736
f"{attr} was failed because it has failed previously and its failure has been cached.",
733737
f" first failure time: {self.getProperty('first_failure')}",
738+
f" first failure url: {self.getProperty('first_failure_url')}",
734739
]
735740
)
736741
+ "\n"

buildbot_nix/failed_builds.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from pathlib import Path
44
from typing import TYPE_CHECKING, Any
55

6-
from pydantic import BaseModel
6+
from pydantic import BaseModel, Field
77

88
if TYPE_CHECKING:
99
database: None | dbm._Database = None
@@ -18,6 +18,7 @@ class FailedBuildsError(Exception):
1818
class FailedBuild(BaseModel):
1919
derivation: str
2020
time: datetime
21+
url: str = Field(default="unknown")
2122

2223

2324
DB_NOT_INIT_MSG = "Database not initialized"
@@ -30,12 +31,12 @@ def initialize_database(db_path: Path) -> None:
3031
database = dbm.open(str(db_path), "c")
3132

3233

33-
def add_build(derivation: str, time: datetime) -> None:
34+
def add_build(derivation: str, time: datetime, url: str) -> None:
3435
global database # noqa: PLW0602
3536

3637
if database is not None:
3738
database[derivation] = FailedBuild(
38-
derivation=derivation, time=time
39+
derivation=derivation, time=time, url=url
3940
).model_dump_json()
4041
else:
4142
raise FailedBuildsError(DB_NOT_INIT_MSG)

0 commit comments

Comments
 (0)