1717from buildbot .plugins import schedulers , steps , util , worker
1818from buildbot .process import buildstep , logobserver , remotecommand
1919from buildbot .process .buildstep import SUCCESS
20+
21+ # from buildbot.db.buildrequests import BuildRequestModel
22+ # from buildbot.db.builds import BuildModel
23+ from buildbot .process .log import Log
2024from buildbot .process .project import Project
2125from buildbot .process .properties import Properties
2226from buildbot .process .results import ALL_RESULTS , statusToString , worst_status
2731from buildbot .www .authz import Authz
2832from buildbot .www .authz .endpointmatchers import EndpointMatcherBase , Match
2933
30- # from buildbot.db.buildrequests import BuildRequestModel
31- # from buildbot.db.builds import BuildModel
3234if TYPE_CHECKING :
33- from buildbot .process .log import Log , StreamLog
35+ from buildbot .process .log import StreamLog
3436 from buildbot .www .auth import AuthBase
3537
3638from pydantic import TypeAdapter
@@ -67,7 +69,7 @@ class BuildbotNixError(Exception):
6769 pass
6870
6971
70- class BuildTrigger (steps .BuildStep ):
72+ class BuildTrigger (buildstep . ShellMixin , steps .BuildStep ):
7173 """Dynamic trigger that creates a build for every attribute."""
7274
7375 project : GitProject
@@ -118,14 +120,12 @@ def __init__(
118120 successful_jobs : list [NixEvalJobSuccess ],
119121 failed_jobs : list [NixEvalJobError ],
120122 report_status : bool ,
121- all_derivations : dict [str , NixDerivation ],
122123 ** kwargs : Any ,
123124 ) -> None :
124125 self .project = project
125126 self .successful_jobs = successful_jobs
126127 self .failed_jobs = failed_jobs
127128 self .report_status = report_status
128- self .all_derivations = all_derivations
129129 self .config = None
130130 self .builds_scheduler = builds_scheduler
131131 self .skipped_builds_scheduler = skipped_builds_scheduler
@@ -170,7 +170,10 @@ def get_scheduler_by_name(self, name: str) -> BaseScheduler:
170170
171171 @staticmethod
172172 def set_common_properties (
173- props : Properties , source : str , job : NixEvalJob , report_status : bool ,
173+ props : Properties ,
174+ source : str ,
175+ job : NixEvalJob ,
176+ report_status : bool ,
174177 ) -> Properties :
175178 props .setProperty ("virtual_builder_name" , f".#checks.{ job .attr } " , source )
176179 props .setProperty ("status_name" , f"nix-build .#checks.{ job .attr } " , source )
@@ -180,41 +183,59 @@ def set_common_properties(
180183
181184 return props
182185
183- def schedule_eval_failure (self , job : NixEvalJobError , report_status : bool ) -> tuple [str , Properties ]:
186+ def schedule_eval_failure (
187+ self , job : NixEvalJobError , report_status : bool
188+ ) -> tuple [str , Properties ]:
184189 source = "nix-eval-nix"
185190
186- props = BuildTrigger .set_common_properties (Properties (), source , job , report_status )
191+ props = BuildTrigger .set_common_properties (
192+ Properties (), source , job , report_status
193+ )
187194 props .setProperty ("error" , job .error , source )
188195
189196 return (self .failed_eval_scheduler , props )
190197
191- def schedule_cached_failure (self , job : NixEvalJobSuccess , report_status : bool ) -> tuple [str , Properties ]:
198+ def schedule_cached_failure (
199+ self , job : NixEvalJobSuccess , report_status : bool
200+ ) -> tuple [str , Properties ]:
192201 source = "nix-eval-nix"
193202
194- props = BuildTrigger .set_common_properties (Properties (), source , job , report_status )
203+ props = BuildTrigger .set_common_properties (
204+ Properties (), source , job , report_status
205+ )
195206
196207 return (self .cached_failure_scheduler , props )
197208
198209 def schedule_dependency_failed (
199- self , job : NixEvalJobSuccess , dependency : NixEvalJobSuccess , report_status : bool ,
210+ self ,
211+ job : NixEvalJobSuccess ,
212+ dependency : NixEvalJobSuccess ,
213+ report_status : bool ,
200214 ) -> tuple [str , Properties ]:
201215 source = "nix-eval-nix"
202216
203- props = BuildTrigger .set_common_properties (Properties (), source , job , report_status )
217+ props = BuildTrigger .set_common_properties (
218+ Properties (), source , job , report_status
219+ )
204220 props .setProperty ("dependency.attr" , dependency .attr , source )
205221
206222 return (self .dependency_failed_scheduler , props )
207223
208224 def schedule_success (
209- self , build_props : Properties , job : NixEvalJobSuccess , report_status : bool ,
225+ self ,
226+ build_props : Properties ,
227+ job : NixEvalJobSuccess ,
228+ report_status : bool ,
210229 ) -> tuple [str , Properties ]:
211230 source = "nix-eval-nix"
212231
213232 drv_path = job .drvPath
214233 system = job .system
215234 out_path = job .outputs ["out" ] or None
216235
217- props = BuildTrigger .set_common_properties (Properties (), source , job , report_status )
236+ props = BuildTrigger .set_common_properties (
237+ Properties (), source , job , report_status
238+ )
218239 props .setProperty ("system" , system , source )
219240 props .setProperty ("drv_path" , drv_path , source )
220241 props .setProperty ("out_path" , out_path , source )
@@ -350,26 +371,53 @@ def get_failed_dependents(
350371
351372 return removed
352373
374+ @defer .inlineCallbacks
375+ def get_all_derivations (
376+ self , log : Log
377+ ) -> Generator [Any , Any , dict [str , NixDerivation ]]:
378+ log .addStdout ("getting derivation infos\n " )
379+ cmd = yield self .makeRemoteShellCommand (
380+ stdioLogName = None ,
381+ collectStdout = True ,
382+ command = (
383+ ["nix" , "derivation" , "show" , "--recursive" ]
384+ + [job .drvPath for job in self .successful_jobs ]
385+ ),
386+ )
387+ yield self .runCommand (cmd )
388+ log .addStdout ("done\n " )
389+
390+ try :
391+ return TypeAdapter (dict [str , NixDerivation ]).validate_json (cmd .stdout )
392+ except json .JSONDecodeError as e :
393+ msg = f"Failed to parse `nix derivation show` output for { cmd .command } "
394+ raise BuildbotNixError (msg ) from e
395+
353396 @defer .inlineCallbacks
354397 def run (self ) -> Generator [Any , Any , None ]:
355398 self .running = True
356399 build_props = self .build .getProperties ()
357400 ss_for_trigger = self .prepare_sourcestamp_list_for_trigger ()
358401 scheduler_log : Log = yield self .addLog ("scheduler" )
359402
403+ all_derivations = yield self .get_all_derivations (scheduler_log )
404+
360405 # inject failed buildsteps for any failed eval jobs we got
361406 overall_result = SUCCESS if not self .failed_jobs else util .FAILURE
362407 if self .failed_jobs :
363408 scheduler_log .addStdout ("The following jobs failed to evaluate:\n " )
364409 for failed_job in self .failed_jobs :
365410 scheduler_log .addStdout (f"\t - { failed_job .attr } failed eval\n " )
366- brids , _ = yield self .schedule (ss_for_trigger , * self .schedule_eval_failure (failed_job , self .report_status ))
411+ brids , _ = yield self .schedule (
412+ ss_for_trigger ,
413+ * self .schedule_eval_failure (failed_job , self .report_status ),
414+ )
367415 self .brids .extend (brids )
368416
369417 # get all input derivations for every job as a dictionary
370418 derivations_inputs : dict [str , set [str ]] = {
371419 derivation : set (info .inputDrvs .keys ())
372- for derivation , info in self . all_derivations .items ()
420+ for derivation , info in all_derivations .items ()
373421 }
374422
375423 # get all job derivations
@@ -407,7 +455,8 @@ def run(self) -> Generator[Any, Any, None]:
407455 build_schedule_order .remove (build )
408456
409457 brids , results_deferred = yield self .schedule (
410- ss_for_trigger , * self .schedule_cached_failure (build , self .report_status )
458+ ss_for_trigger ,
459+ * self .schedule_cached_failure (build , self .report_status ),
411460 )
412461 scheduled .append (
413462 BuildTrigger .ScheduledJob (build , brids , results_deferred )
@@ -434,7 +483,8 @@ def run(self) -> Generator[Any, Any, None]:
434483 for job in schedule_now :
435484 scheduler_log .addStdout (f"\t - { job .attr } \n " )
436485 brids , results_deferred = yield self .schedule (
437- ss_for_trigger , * self .schedule_success (build_props , job , self .report_status )
486+ ss_for_trigger ,
487+ * self .schedule_success (build_props , job , self .report_status ),
438488 )
439489
440490 scheduled .append (
@@ -472,7 +522,9 @@ def run(self) -> Generator[Any, Any, None]:
472522 job , build_schedule_order , job_closures
473523 )
474524 for removed_job in removed :
475- scheduler , props = self .schedule_dependency_failed (removed_job , job , self .report_status )
525+ scheduler , props = self .schedule_dependency_failed (
526+ removed_job , job , self .report_status
527+ )
476528 brids , results_deferred = yield self .schedule (
477529 ss_for_trigger , scheduler , props
478530 )
@@ -577,26 +629,6 @@ def run(self) -> Generator[Any, object, Any]:
577629
578630 self .number_of_jobs = len (successful_jobs )
579631
580- drv_show_log : Log = yield self .getLog ("stdio" )
581- drv_show_log .addStdout ("getting derivation infos\n " )
582- cmd = yield self .makeRemoteShellCommand (
583- stdioLogName = None ,
584- collectStdout = True ,
585- command = (
586- ["nix" , "derivation" , "show" , "--recursive" ]
587- + [job .drvPath for job in successful_jobs ]
588- ),
589- )
590- yield self .runCommand (cmd )
591- drv_show_log .addStdout ("done\n " )
592- try :
593- all_derivations : dict [str , NixDerivation ] = TypeAdapter (
594- dict [str , NixDerivation ]
595- ).validate_json (cmd .stdout )
596- except json .JSONDecodeError as e :
597- msg = f"Failed to parse `nix derivation show` output for { cmd .command } "
598- raise BuildbotNixError (msg ) from e
599-
600632 self .build .addStepsAfterCurrentStep (
601633 [
602634 BuildTrigger (
@@ -613,7 +645,6 @@ def run(self) -> Generator[Any, object, Any]:
613645 self .job_report_limit is None
614646 or self .number_of_jobs <= self .job_report_limit
615647 ),
616- all_derivations = all_derivations ,
617648 ),
618649 ]
619650 + (
0 commit comments