@@ -50,7 +50,7 @@ class JobsConfig:
5050 successful_jobs : list [NixEvalJobSuccess ]
5151 failed_jobs : list [NixEvalJobError ]
5252 combine_builds : bool
53- failed_builds_db : FailedBuildDB
53+ failed_builds_db : FailedBuildDB | None
5454
5555
5656class BuildTrigger (buildstep .ShellMixin , steps .BuildStep ):
@@ -72,7 +72,7 @@ class BuildTrigger(buildstep.ShellMixin, steps.BuildStep):
7272 wait_for_finish_deferred : defer .Deferred [tuple [list [int ], int ]] | None
7373 brids : list [int ]
7474 consumers : dict [int , Any ]
75- failed_builds_db : FailedBuildDB
75+ failed_builds_db : FailedBuildDB | None
7676
7777 @dataclass
7878 class ScheduledJob :
@@ -372,51 +372,54 @@ async def _schedule_failed_evaluations(
372372 scheduled .append (
373373 BuildTrigger .ScheduledJob (failed_job , brids , results_deferred )
374374 )
375- self .brids .extend (brids )
375+ self .brids .extend (brids . values () )
376376
377377 return overall_result
378378
379379 async def _process_build_for_scheduling (
380380 self ,
381381 build : NixEvalJobSuccess ,
382- context : SchedulingContext ,
382+ ctx : SchedulingContext ,
383383 ) -> None :
384384 """Process a single build to determine if it should be scheduled."""
385- failed_build = self .jobs_config .failed_builds_db .check_build (build .drvPath )
385+ failed_build = None
386+ if self .jobs_config .failed_builds_db is not None :
387+ failed_build = self .jobs_config .failed_builds_db .check_build (build .drvPath )
386388
387- if context .job_closures .get (build .drvPath ):
389+ if ctx .job_closures .get (build .drvPath ):
388390 # Has dependencies, skip for now
389391 return
390392
391393 if failed_build is not None and self .build :
392394 if self .build .reason != "rebuild" :
393395 # Skip due to cached failure
394- context .scheduler_log .addStdout (
396+ ctx .scheduler_log .addStdout (
395397 f"\t - skipping { build .attr } due to cached failure, first failed at { failed_build .time } \n "
396398 f"\t see build at { failed_build .url } \n "
397399 )
398- context .build_schedule_order .remove (build )
400+ ctx .build_schedule_order .remove (build )
399401
400402 brids , results_deferred = await self .schedule (
401- context .ss_for_trigger ,
403+ ctx .ss_for_trigger ,
402404 * self .schedule_cached_failure (build , failed_build ),
403405 )
404- context .scheduled .append (
406+ ctx .scheduled .append (
405407 BuildTrigger .ScheduledJob (build , brids , results_deferred )
406408 )
407409 self .brids .extend (brids .values ())
408410 else :
409411 # Rebuild requested, remove from cache and schedule
410- self .jobs_config .failed_builds_db .remove_build (build .drvPath )
411- context .scheduler_log .addStdout (
412+ if self .jobs_config .failed_builds_db is not None :
413+ self .jobs_config .failed_builds_db .remove_build (build .drvPath )
414+ ctx .scheduler_log .addStdout (
412415 f"\t - not skipping { build .attr } with cached failure due to rebuild, first failed at { failed_build .time } \n "
413416 )
414- context .build_schedule_order .remove (build )
415- context .schedule_now .append (build )
417+ ctx .build_schedule_order .remove (build )
418+ ctx .schedule_now .append (build )
416419 else :
417420 # No cached failure, schedule normally
418- context .build_schedule_order .remove (build )
419- context .schedule_now .append (build )
421+ ctx .build_schedule_order .remove (build )
422+ ctx .schedule_now .append (build )
420423
421424 async def _get_failed_build_url (self , brids : dict [str , Any ]) -> str :
422425 """Get the URL of the actual failed build."""
@@ -435,7 +438,7 @@ async def _get_failed_build_url(self, brids: dict[str, Any]) -> str:
435438 async def _handle_failed_job (
436439 self ,
437440 job : NixEvalJob ,
438- context : SchedulingContext ,
441+ ctx : SchedulingContext ,
439442 brids : dict [str , Any ],
440443 result : int ,
441444 ) -> None :
@@ -444,7 +447,7 @@ async def _handle_failed_job(
444447 return
445448
446449 # Update failed builds cache if needed
447- if result == util .FAILURE :
450+ if result == util .FAILURE and self . jobs_config . failed_builds_db is not None :
448451 should_add_to_cache = (
449452 self .build and self .build .reason == "rebuild"
450453 ) or not self .jobs_config .failed_builds_db .check_build (job .drvPath )
@@ -456,28 +459,28 @@ async def _handle_failed_job(
456459
457460 # Schedule dependent failures
458461 removed = self .get_failed_dependents (
459- job , context .build_schedule_order , context .job_closures
462+ job , ctx .build_schedule_order , ctx .job_closures
460463 )
461464 for removed_job in removed :
462465 scheduler , props = self .schedule_dependency_failed (removed_job , job )
463466 dep_brids , results_deferred = await self .schedule (
464- context .ss_for_trigger , scheduler , props
467+ ctx .ss_for_trigger , scheduler , props
465468 )
466- context .build_schedule_order .remove (removed_job )
467- context .scheduled .append (
469+ ctx .build_schedule_order .remove (removed_job )
470+ ctx .scheduled .append (
468471 BuildTrigger .ScheduledJob (removed_job , dep_brids , results_deferred )
469472 )
470473 self .brids .extend (dep_brids .values ())
471474
472475 if removed :
473- context .scheduler_log .addStdout (
476+ ctx .scheduler_log .addStdout (
474477 "\t - removed jobs: "
475478 + ", " .join ([job .drvPath for job in removed ])
476479 + "\n "
477480 )
478481
479482 # Update job closures
480- for job_closure in context .job_closures .values ():
483+ for job_closure in ctx .job_closures .values ():
481484 if job .drvPath in job_closure :
482485 job_closure .remove (job .drvPath )
483486
@@ -523,7 +526,7 @@ async def run(self) -> int:
523526 )
524527
525528 # Create scheduling context that will be reused throughout the loop
526- context = BuildTrigger .SchedulingContext (
529+ ctx = BuildTrigger .SchedulingContext (
527530 build_schedule_order = build_schedule_order ,
528531 job_closures = job_closures ,
529532 ss_for_trigger = ss_for_trigger ,
@@ -533,34 +536,33 @@ async def run(self) -> int:
533536 )
534537
535538 # Main scheduling loop
536- while build_schedule_order or scheduled :
537- scheduler_log .addStdout ("Scheduling...\n " )
539+ while ctx . build_schedule_order or ctx . scheduled :
540+ ctx . scheduler_log .addStdout ("Scheduling...\n " )
538541
539542 # Determine which jobs to schedule now
540- context .schedule_now = []
541- for build in list (build_schedule_order ):
542- await self ._process_build_for_scheduling (build , context )
543+ ctx .schedule_now = []
544+ for build in list (ctx . build_schedule_order ):
545+ await self ._process_build_for_scheduling (build , ctx )
543546
544- if not context .schedule_now :
545- scheduler_log .addStdout ("\t No builds to schedule found.\n " )
547+ if not ctx .schedule_now :
548+ ctx . scheduler_log .addStdout ("\t No builds to schedule found.\n " )
546549
547550 # Schedule ready jobs
548- for job in context .schedule_now :
549- scheduler_log .addStdout (f"\t - { job .attr } \n " )
551+ for job in ctx .schedule_now :
552+ ctx . scheduler_log .addStdout (f"\t - { job .attr } \n " )
550553 brids , results_deferred = await self .schedule (
551- ss_for_trigger ,
554+ ctx . ss_for_trigger ,
552555 * self .schedule_success (build_props , job ),
553556 )
554- scheduled .append (
557+ ctx . scheduled .append (
555558 BuildTrigger .ScheduledJob (job , brids , results_deferred )
556559 )
557560 self .brids .extend (brids .values ())
558561
559- scheduler_log .addStdout ("Waiting...\n " )
562+ ctx . scheduler_log .addStdout ("Waiting...\n " )
560563
561- # Wait for a job to complete
562564 self .wait_for_finish_deferred = defer .DeferredList (
563- [job .results for job in scheduled ],
565+ [job .results for job in ctx . scheduled ],
564566 fireOnOneCallback = True ,
565567 fireOnOneErrback = True ,
566568 )
@@ -570,12 +572,12 @@ async def run(self) -> int:
570572 results , index = await self .wait_for_finish_deferred # type: ignore[assignment]
571573
572574 # Process completed job
573- job , brids , _ = scheduled [index ]
575+ job , brids , _ = ctx . scheduled [index ]
574576 done .append (BuildTrigger .DoneJob (job , brids , results ))
575- del scheduled [index ]
577+ del ctx . scheduled [index ]
576578 result = results [0 ]
577579
578- scheduler_log .addStdout (
580+ ctx . scheduler_log .addStdout (
579581 f"Found finished build { job .attr } , result { util .Results [result ].upper ()} \n "
580582 )
581583
@@ -588,10 +590,10 @@ async def run(self) -> int:
588590 )
589591
590592 # Handle failed jobs and their dependents
591- await self ._handle_failed_job (job , context , brids , result )
593+ await self ._handle_failed_job (job , ctx , brids , result )
592594
593595 overall_result = worst_status (result , overall_result )
594- scheduler_log .addStdout (
596+ ctx . scheduler_log .addStdout (
595597 f"\t - new result: { util .Results [overall_result ].upper ()} \n "
596598 )
597599
@@ -605,7 +607,7 @@ async def run(self) -> int:
605607 self .build ,
606608 overall_result ,
607609 )
608- scheduler_log .addStdout ("Done!\n " )
610+ ctx . scheduler_log .addStdout ("Done!\n " )
609611 return overall_result
610612
611613 def getCurrentSummary (self ) -> dict [str , str ]: # noqa: N802
0 commit comments