@@ -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 "
0 commit comments